манипулирование текстом: как исключить определенные строки с помощью sed

В настоящее время я заменяю все < во всем содержимом следующей командой sed

sed -e 's/\&lt;/</g''

но теперь я должен исключить строки, которые содержат <title>, чтобы быть точным, я должен исключить текст между <title> и </title>

например. следующая строка соответствует моей команде, но эту строку следует исключить...

 <title>BEWEGUNGSBOX der ÖDG ab sofort &lt; erhältlich </title>

как я могу решить это с помощью sed? я использую sed в cygwin


person Roland    schedule 27.08.2012    source источник


Ответы (2)


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

sed -e '/<body/,/<\/body/ s/\&lt;/</g' input.htm
person perreal    schedule 27.08.2012
comment
Это может сработать для ОП, но ваше предположение не точно. Было бы с тегом <head>, но не с <title>. - person Birei; 27.08.2012
comment
спасибо, но я должен сделать замену во всем документе, кроме строки заголовка, поэтому тела будет недостаточно. Поэтому я подумал, есть ли отрицание для следующего поиска по заголовку.. sed -e '/‹title/,/‹\/tile/ s/\/‹/g' input.htm - person Roland; 27.08.2012

Мне не нравится идея использовать sed для обработки данных HTML. Но сказал, что попробуйте это:

sed -ne '/<title>.*<\/title>/ { p; b }; /<title>/,/<\/title>/ { p; b }; s/\&lt;/</g; p' infile

Он ищет <title>...</title с обоими тегами в одной строке и печатает их без изменений. В противном случае ищите эти теги в разных строках, используя диапазон. С того места, где одно из предыдущих условий не выполняется, начинайте подставлять &lt;.

person Birei    schedule 27.08.2012