Отфильтруйте тег HTML и замену другими тегами HTML с помощью sed

Я заменял <B> и </B> с <STRONG> и </STRONG> в файле. Это несколько похоже на замену hmtl теги. Я использовал sed 's/\<B\>/STRONG/g'. Это сделало задание, но если в файле [B] и [/B] присутствует. Затем также они изменяются в [STRONG] и [/STRONG]. Я не получаю логику позади него.

5
задан 18 July 2015 в 23:54

3 ответа

По умолчанию 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>
6
ответ дан 23 November 2019 в 08:46

< и > не специальные символы в Основные Регулярные выражения , таким образом, их нельзя оставить. Когда Вы вышли из них, sed попытается рассматривать их как специальные символы, и затем поведение не определено :

интерпретация обычного символа, которому предшествуют ('\'), не определена, за исключением:

скобки Так, просто используйте < и > без выхода:

$ echo 'b<b>' | sed 's/<b>/strong/'  
bstrong
4
ответ дан 23 November 2019 в 08:46

Решение с 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
2
ответ дан 23 November 2019 в 08:46

Другие вопросы по тегам:

Похожие вопросы: