Я заменял <B>
и </B>
с <STRONG>
и </STRONG>
в файле. Это несколько похоже на замену hmtl теги. Я использовал sed 's/\<B\>/STRONG/g'
. Это сделало задание, но если в файле [B]
и [/B]
присутствует. Затем также они изменяются в [STRONG]
и [/STRONG]
. Я не получаю логику позади него.
По умолчанию sed использует основные регулярные выражения. Это означает, что GNU позволяет \<
соответствуйте началу слова и \>
соответствуйте концу слова. Наблюдайте:
$ echo '<B> BBB B' | sed 's/\<B\>/STRONG/g'
<STRONG> BBB STRONG
\<B\>
распознает слово B
который появляется дважды в вышеупомянутой строке. Поскольку это распознает слово B
а не угловые скобки, угловые скобки оставлены без изменений.
Если Вы хотите соответствовать угловым скобкам, <>
, оставьте обратную косую черту:
$ echo '<B> BBB B' | sed 's/<B>/<STRONG>/g'
<STRONG> BBB B
<B>
соответствия открывают угловую скобку, сопровождаемую B
сопровождаемый закрывающей угловой скобкой. Таким образом, <B>
заменяется <STRONG>
но B
оставлен в покое.
$ echo '<B> BBB B </B>' | sed -r 's|<(/)?B>|<\1STRONG>|g'
<STRONG> BBB B </STRONG>
-r
для расширенного regex, но последние версии GNU sed также поддерживают -E
как синоним для -r
. BSD sed использование -E
для этого и, по сообщениям, будущие стандарты POSIX приняли -E
. Таким образом, для совместимости, можно хотеть использовать (благодарность за информацию @Kos):
$ echo '<B> BBB B </B>' | sed -E 's|<(/)?B>|<\1STRONG>|g'
<STRONG> BBB B </STRONG>
<
и >
не специальные символы в Основные Регулярные выражения , таким образом, их нельзя оставить. Когда Вы вышли из них, sed
попытается рассматривать их как специальные символы, и затем поведение не определено :
интерпретация обычного символа, которому предшествуют ('\'), не определена, за исключением:
- символы')', '(', '{', и '}'
- цифры 1 - 9 включительно (см. BREs Соответствовать Нескольким Символам )
- символ А в выражении
скобки Так, просто используйте <
и >
без выхода:
$ echo 'b<b>' | sed 's/<b>/strong/'
bstrong
Решение с awk
. Здесь у меня есть файл примера с двумя строками, которые содержат и теги и используют gsub
функция для замены их. Затем мы производим это для временной работы файла и назад в исходный файл. Удалите временный файл при выполнении. Адаптируйтесь по мере необходимости.
$ cat tags.txt
<B> and </B>
<B> or </B>
$ awk '{gsub("<B>","<STRONG>"); gsub("</B>","</STRONG>");print}' tags.txt
<STRONG> and </STRONG>
<STRONG> or </STRONG>
$ awk '{gsub("<B>","<STRONG>"); gsub("</B>","</STRONG>");print}' tags.txt > tmpfile.txt && cat tmpfile > tags.txt