Операционная система UNIX. Руководство программиста

       

Регулярные выражения


Кроме возможностей, проиллюстрированных в предыдущем разделе, в awk'е есть и более мощное средство спецификации шаблонов - регулярные выражения. Простейшим регулярным выражением является буквальное указание требуемой цепочки. Пример (регулярные выражения обрамляются символами /):

/Asia/

Данное регулярное выражение - законченная awk-программа, печатающая все строки, содержащие какое-либо вхождение цепочки Asia. Если строка содержит более длинное слово, частью которого является цепочка Asia, например Asiatic, она все равно печатается (в файле countries, однако, таких слов нет).

Используемые в awk'е регулярные выражения трактуются так же, как в распознавателе шаблонов egrep(1). Ряд символов имеет специальный смысл.

Например, чтобы напечатать все строки, начинающиеся с A, следу- ет указать регулярное выражение

/^A/

Для печати всех строк, начинающихся с A, B или C, годится регулярное выражение

/^[ABC]/

Все строки, оканчивающиеся цепочкой ia, распечатываются с помощью шаблона

/ia$/

В общем случае, символ ^ обозначает начало строки, символ $ - конец строки, а символы, заключенные в квадратные скобки, [], сопоставляются с любым одиночным символом из перечисленных в скобках. Кроме того, awk позволяет использовать круглые скобки для группировки, а символ | - для перечисления альтернатив. Знак + определяет, что предшествовавшее ему выражение должно сопоставляться один или более раз, знак ? обозначает повторение нуль или один раз. Программа

/x|y/ { print }

печатает все цепочки, содержащие x или y, программа



/ax+b/ { print }

выводит все цепочки, содержащие символ a, за которым следует один или более символов x, а затем b (например, axb, Paxxxxxxxb, QaxxbR). Программа

/ax?b/ { print }

печатает все цепочки, содержащие символ a, за которым следует необязательный x, а затем символ b (например, ab, axb, yaxbPPPP, CabD).

Два символа, . и *, имеют тот же смысл, что и в ed(1). Более подробно, . обозначает произвольный символ, а * - нуль или более вхождений предыдущего символа. Так, шаблон


/a.b/

сопоставляется с любой записью, содержащей символ a, за которым следует произвольный символ, а затем символ b. Другими словами, запись должна включать символы a и b, разделенные произвольным символом. Например, /a.b/ сопоставляются с axb, aPb и xxxxaXbxx, но не с ab, axxb. Шаблон

/ax*c/

сопоставляется с записью, содержащей символы a и c, разделенные цепочкой из произвольного, возможно нулевого, числа символов x. Например, она сопоставляется с цепочками

ac axc pqraxxxxxxxxxxc901

Так же, как и в ed(1), можно отменить специальную интерпретацию метасимволов (например, ^ и *). Для этого перед такими символами ставится знак \. Например, шаблон

/\/.*\//

сопоставляется с произвольной цепочкой символов, заключенной в "скобки" /.../.

Можно также специфицировать, что некоторое поле (переменная) должно сопоставляться с регулярным выражением (либо не сопоставляться). Это делается при помощи операций ~ и !~. Например, для входного файла countries следующая программа выводит на печать все страны, названия которых заканчиваются цепочкой ia:

Russia Australia India Algeria




Содержание раздела