Использование sed - как заменить два HTML-тега или шаблона с неизвестным промежуточным содержимым? - PullRequest
0 голосов
/ 29 октября 2018

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

<div class="section1-title">arbitrary content here</div>

и замените окружающие теги на:

<h2>arbitrary content here</h2>

Я придумал следующее, но, очевидно, он не работает, так как во второй части он буквально подставляет "]. * [<] / H2 [>]" для каждого найденного соответствия.

sed -i 's/[<]div class=\"section1-title\"[>].*[<]\/div[>]/<h2[>].*[<]\/h2[>]/g'

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

1 Ответ

0 голосов
/ 29 октября 2018

Что вам нужно, так это обратная ссылка.

    bash-3.2$ sed 's/<div class=\"section1-title\">\(.*\) 
    <\/div>/<h2>\1<\/h2>/g' <<< '<div class="section1-title">arbitrary 
    content here</div>'
    <h2>arbitrary content here</h2>

Скобки вокруг вашего контента - \(.*\) - позволяют ссылаться на него позже, как и в \1.

См .: https://www.regular -expressions.info / backref.html

и .bash_profile sed: \ 1 не определены в RE для объяснения того, почему в вашем регулярном выражении следует избегать скобок.

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