Использование sed - как заменить два HTML-тега или шаблона неизвестным содержимым между ними?

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

<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 соответствует правильному содержанию, в основном это часть 2, в которой я не уверен.

Всегда рекомендуется использовать правильные инструменты для разбора HTML. sed, awk не предназначены для разбора HTML.

RavinderSingh13 29.10.2018 20:53

Какие инструменты вы бы порекомендовали?

IAspireToBeGladOS 29.10.2018 20:54

И почему для этих целей не рекомендуется использовать sed или awk?

IAspireToBeGladOS 29.10.2018 20:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужна обратная ссылка.

    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 для объяснения того, почему круглые скобки должны быть экранированы в вашем регулярном выражении.

Спасибо! Это то, что я искал, и отличный ресурс. Я обнаружил, что регулярное выражение чрезвычайно жадно и поглощает контент между первым появлением "section1-title" и несколькими другими </div> позже. Я изучаю это сам, но не могли бы вы посоветовать, чтобы он остановился на первом матче </div>?

IAspireToBeGladOS 29.10.2018 21:11

Вы, вероятно, захотите использовать ?, чтобы сделать его ленивым, а не жадным совпадением - \(.*?\) - который будет соответствовать наименьшему количеству символов перед </div>. Или инвертированный класс символов может иметь больше смысла, например \([^<]*\), который будет соответствовать как можно большему количеству символов, отличных от <. (также см. regular-expressions.info/repeat.html)

Mixolydian 29.10.2018 21:19

Второй я пробовал, но есть некоторые теги, содержащие классы <span>, внутри которых я хотел бы выйти. С использованием ? идеально подходит и соответствует именно тому, что мне нужно. Большое спасибо за Вашу помощь! Определенно многому научился на будущее.

IAspireToBeGladOS 29.10.2018 21:22

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