Я хочу оставить неизвестное содержимое между тегами нетронутым, но хочу сопоставить все теги, в которых используются:
<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, в которой я не уверен.
Какие инструменты вы бы порекомендовали?
И почему для этих целей не рекомендуется использовать sed или awk?
Вам нужна обратная ссылка.
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>?
Вы, вероятно, захотите использовать ?
, чтобы сделать его ленивым, а не жадным совпадением - \(.*?\)
- который будет соответствовать наименьшему количеству символов перед </div>
. Или инвертированный класс символов может иметь больше смысла, например \([^<]*\)
, который будет соответствовать как можно большему количеству символов, отличных от <
. (также см. regular-expressions.info/repeat.html)
Второй я пробовал, но есть некоторые теги, содержащие классы <span>, внутри которых я хотел бы выйти. С использованием ? идеально подходит и соответствует именно тому, что мне нужно. Большое спасибо за Вашу помощь! Определенно многому научился на будущее.
Всегда рекомендуется использовать правильные инструменты для разбора HTML.
sed
,awk
не предназначены для разбора HTML.