LINUX.ORG.RU

sed multiline replace

 , , ,


0

1

Попался мне сохранённый wget'ом сайт (куча файлов .html).
Хочу удалить оттуда комментарии и сохранить.
Смотрю в сорцы:

<div id="comments" class="comments-area">

Тут миллион строк всякого говна
			
</div><!-- #comments -->
Значит, это соответствует регулярке. Значит, проблем с удалением проблемных участков быть не должно.
Только как sed'у сказать, что нужно удалить произвольное количество строк?
inb4: пять звёзд нафлудил, а гугл не осилил

★★★★★

Последнее исправление: CYB3R (всего исправлений: 3)

Ответ на: комментарий от anonymous

А если без пхытона? Я сейчас подумал заюзать awk (хотя я мало в нём понимаю). Я могу вывести ненужные участки так:

awk '/<div id="comments"/,/#comments -->/' *.html
А как их теперь удалить?

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Нагуглил решение для awk:

awk '/<div id="comments"/,/#comments -->/ { next } 1' *.html
Только awk не умеет писать в тот же файл, из которого читает (ключ -i у sed). Как быть?

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Сейчас накостылял такое:

for file in *.html; do awk '/<div id="comments"/,/#comments -->/ { next } 1' $file > awk/$file; done
mv awk/*.html .
Не знаю, прав я или нет, но работает.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Ключ -i реализуется записью во временный файл, потом заменой исходного. Сделай обвязку вокруг awk'а.

YAR ★★★★★
()
Ответ на: комментарий от anonymous

В третьем классе ещё не проходили, что div — это блочный элемент, и может хранить другие теги? :}

По сабжу

Только как sed'у сказать, что нужно удалить произвольное количество строк?

Легко и просто. Но конкретно тебе мне лень объяснять, RTFM: http://www.rtfiber.com.tw/~changyj/sed/html/p.20051024a.html

deterenkelt
()
sed '/<div.*/,/<\/div>.*/d'
anonymous
()
Ответ на: комментарий от anonymous

2014

Не иметь представления об html

А, ну да, я же забыл, где я.

deterenkelt
()
<div id="comments" class="comments-area">

Тут миллион строк всякого говна
			
</div><!-- #comments -->

Если у тебя _всегда_ всё выглядит вот так, для awk вот держи

/<div id="comments" class="comments-area">/ { level++ }
level == 0
/<\/div><!-- #comments -->/ {level--}
yoghurt ★★★★★
()
Ответ на: комментарий от CYB3R

А если без пхытона? Я сейчас подумал заюзать awk (хотя я мало в нём понимаю). Я могу вывести ненужные участки так:

в sed точно также, а «удалить» это «d».

emulek
()
Ответ на: комментарий от yoghurt

Он вложенные блоки не обработает (если они есть)

это можно поправить. А нужно-ли?

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.