Боюсь, будет не так просто закрасить слово или несколько слов в строке большим количеством текста. † Хороший модуль окрашивает данную ему строку и не может выбрать части из этого, насколько я знаю.
Так что это должно быть сделано от руки, слово (через пробел) за словом, и это немного грязно. Например,
echo "First HTML appeared, then CSS, then JavaScript" |
perl -MTerm::ANSIColor=:constants -wne'
@p = split /([,.\-\s+])/;
for (@p) { /HTML|php|CSS|Java(Script)?/ ? print RED $_, RESET : print }'
Эта демонстрация корректно работает с данной строкой, но я уверен, что можно найти случаи, которые ее сломают, учитывая, что она анализирует строку в этом split
, что не является простое дело вообще.
Захват ()
в шаблоне разделителя в split делает так, чтобы эти разделители также возвращались в списке результатов, чтобы мы могли восстановить текст со всем, что у него было. Я включаю там некоторые знаки препинания, вместе с пробелами, но это то, на что нужно внимательно смотреть и расширять по мере необходимости.
Этой "игры синтаксического анализа" можно избежать, разбив шаблон регулярных выражений на нужные слова
perl -MTerm::ANSIColor=:constants -wne'
BEGIN { $re = qr/HTML|php|CSS|Java(?:Script)?/ };
for (split /($re)/) { /$re/ ? print RED $_, RESET : print }'
Регулярное выражение сначала сохраняется в переменной, чтобы избежать глупого повторения возможно ужасного выражения
Это все еще страдает от запуска механизма регулярных выражений для каждого слова, что может ощущаться для длинного текста.
† Ну, это так - вставьте подходящие экранирования ANSI, используя регулярные выражения. Смотрите другие ответы здесь для этого подхода