regex
Удобная многострочная подсведка поиска в vim
В vim существует возможность подсвечивать найденные поиском слова командой :hlsearch. Но иногда удобно подсвечивать в логах многострочные блоки текста что бы их было видно невооруженным взглядом в огромном логе.
Но проблема в том что в регулярных выражениях точка . обозначает "любой символ кроме перевода каретки" (в отличии от например sed или perl где это действительно "любой символ"). К тому же * как обычно "жадный", что обозначает что если применять его, то будет найдена первая строка первого блока текста и последняя строка последнего блока текста, и подсвечен весь текст между ними. А нам нужно подсвечивать каждый блок в отдельности.
О том как это реализовывается на регулярных выражениях vim и есть этот типс Ж:-)
Как всегда лучше всего разобраться на примере. Допустим нам надо выделять блоки текста в которых первая строчка
содержит слова "RECV signal" или "SEND signal" и заканчиваются строчкой которая содержит "------".
Результат должен выглядеть так:

Белым цветом выделен только что найденый блок текста, желтым - все остальные найденные блоки.
Такого можно добиться командой:
/\(RECV\|SEND\) sig\_.\{-}------.*Разберем ее по порядку слева на право:
- / - соответственно команда поиска в vim Ж:-)
- \(RECV\|SEND\) sig - ищем в строке или "RECV sig" или "SEND sig"
\(\) служат для группировки, \| для выбора вариантов, "или"
- \_. - вот это самое интересное Ж:-) эта последовательность обозначает "любой символ включая перевод каретки".
- \{-} - это реализация "не жадных" регулярных выражений в vim. в perl это аналог *?. Если вместо
этого поставить банальный * то vim будет искать самое последнее вхождение последующих символов.
- ------ - это мы ищем в последующих строках строку "------".
Итого \_.\{-}------ обозначает "пропустить любое кол-во символов (включая перевод каретки) до тех пор пока первый раз не найдем строку ------"
- .* - тут нужен что бы посветить остатки строки в которой найдена строка "------".
Вот собственно говоря и все Ж:-)
Введение в регулярные выражения
Очень толковое введение для начинающих. Подсветка найденного цветом, txt2regex для помощи составления регулярных выражений и прочее.
http://www.ibm.com/developerworks/ru/library/au-regexp/index.html
ссылки тему на нашем сайте:
http://linsovet.com/howto_colour_grep_results
http://linsovet.com/regex-highlight
подсветка текста в консоли
Иногда хочется пропустить текст через такой фильтр, как grep, но чтобы он только подсветил совпадения, а не вырезал строки с ними.
Можно использовать вот такую функцию, которую можно добавить в ваш ~/.bashrc или ~/.zshrc:
function hilight { ESC=`echo -e "\033"` COLORON="${ESC}[1;33m" COLOROFF="${ESC}[1;0m" if [ -z "$1" ] ; then echo "Usage: hilight 'regex' [file1 file2 ...]" 1>&2; return 1 fi REGEX="$1" shift sed -e "s/${REGEX}/${COLORON}&${COLOROFF}/g" $* }
пример использования:
$ hilight слово *UPD:
можно подобное реализовать на grep ( коментарий с пояснениями)

