Отфильтруйте тег html и замените его другими тегами html, используя sed

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

1
задан 19 July 2015 в 09:54

2 ответа

< и > не являются специальными символами в Basic Regular Exions, поэтому их не следует избегать. Когда вы сбежате от них, sed попытается рассматривать их как специальные символы, а затем поведение не определено:

Интерпретация обычного символа, которому предшествует ('\'), не определена, за исключением : Символы ')', '(', '{' и '}' Цифры с 1 по 9 включительно (см. BRE, соответствующие нескольким символам) Символ внутри выражения скобки

Итак, просто используйте [ f5] и > без экранирования:

$ echo 'b<b>' | sed 's/<b>/strong/'  
bstrong
4
ответ дан 23 May 2018 в 18:56
  • 1
    вы можете объяснить поведение, которое я задал в вопросе – user2280915 19 July 2015 в 10:06
  • 2
    @ user2280915, когда стандарты говорят что-то undefined , все может случиться. В этом случае sed, вероятно, игнорирует экранированные символы, которые не имеют никакой специальности. – muru 19 July 2015 в 10:08
  • 3
    @ user2280915, вероятно, все B s должны быть заменены на STRONG в вашем случае. – Ron 19 July 2015 в 10:10
  • 4
    Это правда, что \< не определено для POSIX sed, но расширение GNU sed делает \< активным. – John1024 19 July 2015 в 10:18
  • 5
    @kos OP может исправить это самостоятельно. – muru 19 July 2015 в 10:21

Решение с awk. Здесь у меня есть пример файла с двумя строками, которые содержат и теги, и используют функцию gsub для их замены. Затем мы выводим это в файл temp и обратно в исходный файл. Удалите временный файл, когда закончите. При необходимости адаптируйте.

$ 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 May 2018 в 18:56
  • 1
    +1, но я не могу смотреть на это && cat tmpfile > tags.txt! ;) Может быть, используйте умную подстановку команд вроде <<< "$(< tags.txt)" awk '{gsub("<B>","<STRONG>"); gsub("</B>","</STRONG>");print}' > tags.txt или что-то вроде sponge: awk '{gsub("<B>","<STRONG>"); gsub("</B>","</STRONG>");print}' tags.txt | sponge tags.txt – kos 19 July 2015 в 10:13
  • 2
    @kos Что вы имеете в виду " Я не могу смотреть на это. , , & Quot; ? вы имеете в виду, что линия слишком длинная или просто неудобно использовать & gt; перенаправление? – Sergiy Kolodyazhnyy 19 July 2015 в 10:16
  • 3
    @kos GNU awk поддерживает редактирование на месте (-i inplace). – muru 19 July 2015 в 10:23
  • 4
    Да, это выглядит немного уродливо, однако лучшим решением было бы использовать gawk вместо awk, как указано в муре – kos 19 July 2015 в 10:29
  • 5
    @muru Я не на Ubuntu прямо сейчас, но если я помню, что gawk не установлен по умолчанию, я думаю, именно поэтому Серг не хотел его использовать – kos 19 July 2015 в 10:30

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

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