2014-02-04 5 views
0

Я пытаюсь сделать следующее:См. Соответствие строки в regex в sed?

У меня есть файл, который содержит HTML-теги, как "<span class='A'> blah </span>", "<span class='B'> blah </span>" и т.д.

, и я хочу, чтобы заменить все вхождения "<span class='A'> blah </span>" на ** blah **. Поэтому я попытался использовать sed.

sed "s/<span class='A'>/*/g" myfile затем,

sed "s/<\span>/*/g" myfile

Это почти заставляет меня, что я хочу, но и портит теги конца участка для других классов, которые я не хочу.

В идеале я хотел бы каким-то образом передать этот текст, совпадающий с помощью [^ <] * в

sed s/<span class='A'>[^<]*</span>/my_replacement_character/g.

+1

Обернуть его в скобки и получить доступ к захваченной группе? – tenub

ответ

2

Вы можете использовать группу захвата и обратную ссылку. В большинстве вариантов регулярных выражений вы можете указать группу захвата с круглыми скобками, в sed вам нужно избежать скобок, поэтому вы должны изменить [^<]* на \([^<]*\). Затем в вашей замене вы можете использовать \1 для обозначения того, что было захвачено.

В конце концов, это должно выглядеть примерно так:

sed "s/<span class='A'>\([^<]*\)<\/span>/**\1**/g" 

В некотором GNU СЭД (и, возможно, другие реализации), вы можете использовать флаг -r или --regexp-extended сделать СЕПГ регулярного выражения более совместимым с другими вкусами. Таким образом, вам не нужно было бы избегать круглых скобок:

sed -r "s/<span class='A'>([^<]*)<\/span>/**\1**/g" 
+0

Нашел его сам несколько секунд назад. Тем не менее, это будет правильным ответом. Спасибо! – shyamupa

Смежные вопросы