Регулярные выражения
10.9. Регулярные выражения
awk обеспечивает более мощные шаблоны для поиска строки символов, чем сравнение. Такие шаблоны называются регулярными выражениями. Простейшим регулярным выражением является строка символов, обрамленная знаками "/". Например: /Asia/
Эта программа печатает все записи, которые содержат подстроку Asia (запись, содержащая Asia как часть длинной строки, подобной Asian или Pan-Asiatic, также печатается).
Чтобы ограничить поиск только для специального поля, вы можете использовать операторы ~(входит) и !~(не входит). Программа: $4 ~ /Asia/ { print $1 } печатает первое поле всех тех строк, в которых четвертое поле - Asia, в то время как программа: $4 !~ /Asia/ { print $1 } печатает первое поле всех тех строк, в которых четвертое поле - не Asia.
В регулярном выражении могут использоваться метасимволы: \, ^, $, ., [, ], *, ?, (, ), | которые подобны метасимволам, используемым в shell. Например, метасимволы "^" и "$" осуществляют поиск соответственно начала и конца строки, а метасимвол "." ищет одиночный символ. Например: /^.$/ просматривает все записи для поиска записи, состоящей из одного символа.
Если группа символов заключена в квадратные скобки, то это означает поиск одного символа из этой группы. Например, /[ABC]/ - осуществляет поиск либо символа "A", либо "B", либо "C". Границы букв или цифр могут быть обозначены внутри квадратных скобок:
/[a-zA-Z]/
Если первым символом после "[" является символ "^", то это означает: любой символ, не входящий в набор. Например: /[^a-zA-Z]/ означает поиск любого символа, кроме буквы.
Символ "+" означает "один или больше". Например, программа: $2 !~ /^[0-9]+$/ печатает все записи, в которых второе поле не является строкой из одной или более цифр. (^ - начало строки, [0-9]+ - одна или более цифр, $ -конец строки).
Круглые скобки используются для группирования символов, а символ | для указания альтернативы. Программа: /(apple|cherry) (pie|tart)/ осуществляет поиск строк, содержащих одну из 4-х подстрок: apple pie apple tart cherry pie cherry tart
Чтобы отменить специальное значение метасимвола, поставьте знак "\" перед ним. Например: /b\$/ печатает все строки, содержащие символ "b" и следующий за ним знак "$".
В дополнение к распознаваемым метасимволам, awk распознает следующие последовательности языка программирования Си внутри регулярных выражений и строк:
\b - возврат
\f - перевод формата
\n - новая строка
\r - возврат каретки
\t - табуляция
\ddd - восьмиричное значение
\" - кавычки
\c - с
Например, чтобы напечатать все строки, содержащие табуляцию, воспользуйтесь программой: /\t/
awk интерпретирует любую строку или переменную справа от символа "~" или "!~" как регулярное выражение. Например, мы можем записать программу: $2 !~ /^[0-9]+$/ как BEGIN { digits = "^[0-9]+&" } $2 !~ digits
Предположим, что нужно найти строку символов, подобную ^[0-9]+$. Если строка "^[0-9]+$" используется как регулярное выражение, появляются дополнительные знаки "\", которые защищают регулярное выражение. Это связано с тем, что первый уровень знаков "\" удаляется при синтаксическом анализе строки. Первый уровень "\" перед символом возвращает его специальное значение в регулярном выражении, второй нужен, чтобы защитить его в строке.
Например, нужно найти строки, содержащие "b" и следующий за ним знак "$". Регулярное выражение для этого шаблона: b\$
Чтобы создать строку для представления этого регулярного выражения, необходимо добавить еще один символ "\": "b\\$"
Следующие регулярные выражения попарно эквивалентны: x ~ "b\\$" x ~ /b\$/ x ~ "b\$" x ~ /b$/ x ~ "b$" x ~ /b$/ x ~ "\\t" x ~ /\t/
Регулярные выражения и подстроки, поиск которых они осуществляют, приведены в табл. 22.
Унарные операции *, +, ? имеют наивысший приоритет, затем конкатенация и затем альтернативный выбор |.