Я новичок в форуме, поэтому прошу простить любые синтаксические ошибки в моем вопросе.
Я пытаюсь заменить пробелы символами подчеркивания только в подстрочной подстроке. Я решил, что sed будет лучшим редактором для этого, но я не могу найти правильный код для этого.
Пример строки из файла1 ниже:
Некоторый текст перед шаблоном для соответствия href = "./ Имя динамического каталога - Junk_files / нерелевантные вещи после совпадения">Хотелось бы изменить на это:
Некоторое сообщение перед шаблоном для соответствия href = "./ Имя динамического каталога - Junk_files / нерелевантный материал после совпадения">
] Некоторый текст перед шаблоном, чтобы соответствовать href = "./ Dynamic_Directory_name _-_ Junk_files / нерелевантный материал после совпадения">
Я думал, что был близок с этим cat file1 |sed '/\.\/.*. Junk_files/ { s/ /_/g; }', но все, что он сделал, это заменить все пробелы на совпадающем строка с символами подчеркивания.
Попробуйте это, он найдет первую пару косых черт и удалит все пробелы между!
awk -F'/' '{for(i=2;i<=NF;i++)if(i==2)gsub(" ","_",$i);}1' OFS="/"
Попробуйте это, он найдет первую пару косых черт и удалит все пробелы между!
file='href="./Dynamic Directory name - Junk_files/irrelevant stuff after match">'
echo $file | awk -F'/' '{for(i=2;i<=NF;i++)if(i==2)gsub(" ","_",$i);}1' OFS="/"
# Output:
href="./Dynamic_Directory_name_-_Junk_files/irrelevant stuff after match">
Лучше использовать парсер XML.
Если вы настаиваете на использовании sed; предполагая, что шаблон остается неизменным:
sed -r 's#^([^/]+/[^ ]+) ([^ ]+) ([^ ]+) - ([^ ]+/)#\1_\2_\3_-_\4#' file.txt
Это заменит все пробелы между двумя косами спуска (/) с символами подчеркивания (_). Поскольку вход содержит /, я использовал # как разделитель шаблонов для sed.
Пример:
% sed -r 's#^([^/]+/[^ ]+) ([^ ]+) ([^ ]+) - ([^ ]+/)#\1_\2_\3_-_\4#' <<<'Some text before pattern to match href="./Dynamic Directory name - Junk_files/irrelevant stuff after match">'
Some text before pattern to match href="./Dynamic_Directory_name_-_Junk_files/irrelevant stuff after match">
Это HTML, и если вы не имеете достаточно четко определенного достаточно подмножества HTML в вашем файле, разбор HTML с использованием регулярных выражений - довольно плохая идея.
Этот однострочный Perl работает для замены что подстрока в этом конкретном контексте:
printf 'Some text before pattern to match href="./Dynamic Directory name - Junk_files/irrelevant stuff after match">\n' | perl -ne 'if(/(.*?")(.*\/)(.*)/){$x = $1; $y = $2; $z = $3; $y =~ s/ /_/g; print("$x$y$z")}'
Значение: оно просто заменит пробелы символами подчеркивания в первой найденной подстроке " и /. Но это все. Если вы разбираете сложный документ, не используйте его. Вы можете сделать шаблон более строгим (например, вы могли бы использовать /href=(.*?")(.*\/)(.*)/ и print("href=$x$y$z")), но это все равно может потерпеть неудачу при любом появлении /href=(.*?")(.*\/)(.*)/.
Если вы не разбираетесь очень хорошо и вы уверены, что что-то вроде этого не подведет, просто используйте парсер HTML.