Про жадность я уже много написал, регулярные выражения в sed жадные, однако, мы можем фильтровать текст не только в пределах одной строки, но и так-же по несколько строк сразу. Для этого в sed предусмотрены диапазоны адресов, от чего-то, до чего-то другого. В качестве адреса можно использовать номер строки или регулярные выражения. Такой диапазон естественно не жадный, например
/X/,/Y/p
распечатает всё от первой X, до первой-же Y. Мы сейчас проанализируем HTML текст, в котором мы выделим комментарии. Именно HTML был взят потому, что в нём можно вставлять и убирать любое количество переводов строки, при этом, результат отображения текста не меняется (в HTML любое количество символов ` ', '\t', `\n' и `\r' эквивалентно одиночному пробелу). Что-бы выделить комментарий можно конечно собрать большую строку, в которой этот комментарий полностью укладывается, а затем, используя маркёры, его выделить. Это довольно долгая и нудная история,
потому мы поступим по другому: во первых, переформатируем текст так, что-бы строка с комментарием всегда начиналась на <!--, и всегда заканчивалась на --> Сделать это очень просто - достаточно вставить нужное число символов перевода строки:
$ sed 's/<!--/\n\0/g; s/-->/\0\n/g'
А теперь все строки у нас поделятся на 5 категорий:
Сначала отфильтруем и распечатаем строки #2:
$ sed -n '/<!--.*-->/{p;b}'
Команда b тут необходима для того, что-бы данные строки не мешались дальнейшему анализу.
-n
) и переходу к загрузке сл. строки.
А вот теперь можно легко отфильтровать строки #3, #4, и #5:
$ sed -n '/<!--.*-->/{p;b}; /<!--/,/-->/p'
Точно так-же можно выделять и обрабатывать скрипты и таблицы в HTML тексте. Заменив команду p на что-то вроде
{ w comments.html d }
можно отправить комменты в файл, а в выходном потоке останется чистый HTML без комментариев.
Вы можете обсудить этот документ на форуме. Текст предоставляется по лицензии GNU Free Documentation License (Перевод лицензии GFDL).
Вы можете пожертвовать небольшую сумму яндекс-денег на счёт 41001666004238 для оплаты хостинга, интернета, и прочего. Это конечно добровольно, однако это намного улучшит данный документ (у меня будет больше времени для его улучшения). На самом деле, проект часто находится на грани закрытия, ибо никаких денег никогда не приносил, и приносить не будет. Вы можете мне помочь. Спасибо.