Ещё один подход к регулировке жадности.

Вырезание комментариев в HTML.

Про жадность я уже много написал, регулярные выражения в sed жадные, однако, мы можем фильтровать текст не только в пределах одной строки, но и так-же по несколько строк сразу. Для этого в sed предусмотрены диапазоны адресов, от чего-то, до чего-то другого. В качестве адреса можно использовать номер строки или регулярные выражения. Такой диапазон естественно не жадный, например

/X/,/Y/p

распечатает всё от первой X, до первой-же Y. Мы сейчас проанализируем HTML текст, в котором мы выделим комментарии. Именно HTML был взят потому, что в нём можно вставлять и убирать любое количество переводов строки, при этом, результат отображения текста не меняется (в HTML любое количество символов ` ', '\t', `\n' и `\r' эквивалентно одиночному пробелу). Что-бы выделить комментарий можно конечно собрать большую строку, в которой этот комментарий полностью укладывается, а затем, используя маркёры, его выделить. Это довольно долгая и нудная история,

Замечание

Тем не менее, на практике я поступил именно так.

потому мы поступим по другому: во первых, переформатируем текст так, что-бы строка с комментарием всегда начиналась на <!--, и всегда заканчивалась на --> Сделать это очень просто - достаточно вставить нужное число символов перевода строки:

$ sed 's/<!--/\n\0/g; s/-->/\0\n/g'

А теперь все строки у нас поделятся на 5 категорий:

  1. Обычные строки, с ними мы ничего не делаем.
  2. строки, которые полностью содержат комментарий, такие строки всегда начинаются на <!--, и заканчиваются на -->, мы их просто распечатаем.
  3. Строки, которые начинают комментарий, но в которых нет окончания.
  4. Окончание комментария.
  5. Строки комментария, которые лежат между строками #3 и #4.

Сначала отфильтруем и распечатаем строки #2:

$ sed -n '/<!--.*-->/{p;b}'

Команда b тут необходима для того, что-бы данные строки не мешались дальнейшему анализу.

Замечание

Команда b без параметров приводит к выполнению третьего этапа, к выводу буфера (хотя этот вывод в данном случае подавлен ключом -n) и переходу к загрузке сл. строки.

А вот теперь можно легко отфильтровать строки #3, #4, и #5:

$ sed -n '/<!--.*-->/{p;b}; /<!--/,/-->/p'

Точно так-же можно выделять и обрабатывать скрипты и таблицы в HTML тексте. Заменив команду p на что-то вроде

{
	w comments.html
	d
}

можно отправить комменты в файл, а в выходном потоке останется чистый HTML без комментариев.

Замечание

Конечно тут есть ошибка ;) Конкретно - в команде w.

Вы можете обсудить этот документ на форуме. Текст предоставляется по лицензии GNU Free Documentation License (Перевод лицензии GFDL).

Вы можете пожертвовать небольшую сумму яндекс-денег на счёт 41001666004238 для оплаты хостинга, интернета, и прочего. Это конечно добровольно, однако это намного улучшит данный документ (у меня будет больше времени для его улучшения). На самом деле, проект часто находится на грани закрытия, ибо никаких денег никогда не приносил, и приносить не будет. Вы можете мне помочь. Спасибо.