Команда Sed для обработки входного потока и замены всех тегов HTML <i>на теги <em> - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь написать регулярное выражение с командой sed для обработки входного потока и замены всех тегов HTML на теги, например:

This is <i id="x">emphasized text</i> and <i>so is this</i>.

будет заменено на

This is <em id="x">emphasized text</em> and <em>so is this</em>.

Я попробовал следующее:

sed -r 's/<\/?i[^>]*> / <\/?em[^>]*>/ /g'

Может кто-нибудь посоветовать, как это написать?

1 Ответ

0 голосов
/ 27 декабря 2018

Вы должны использовать более подходящий инструмент;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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...