Вы должны использовать более подходящий инструмент;HTML не является обычным языком, и поэтому не следует анализировать с помощью регулярных выражений , а sed
- это инструмент на основе строк, в то время как переводы строк игнорируются в HTML.
Если выуверены, что вы можете игнорировать это (ваш HTML является самым стандартным из существующих, у вас никогда не будет тега, определение которого разбито на несколько строк и т. д.), следующая команда GNU sed
может работать для вас:
sed -E 's@<(/?)i\b@<\1em@g'
Мы используем -E
RE regex, а не BRE-вариант по умолчанию, чтобы иметь возможность использовать метасимвол \b
«граница слова», который будет следить за тем, чтобы за i не следовалдругие буквы (не хотят совпадать с тегами <img
, <input
или <iframe
);используйте -r
для более старых версий GNU sed
.
Мы заменим </i
и <i
за один проход, захватив необязательный /
в группу захвата, о которой мы говорим вшаблон замены.При сопоставлении <i
замена будет <em
, поскольку группа захвата пуста, а при сопоставлении </i
это будет </em
.
Я использовал @
в качестве разделителя для поиска / заменыкоманда вместо обычной /
, чтобы избежать экранирования /
в шаблоне.
В противном случае вам следует изучить HTML или даже XML-парсеры, если вы анализируете XHTML.