MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
10.9. Регулярные выражения
25.04.2013
22:27
Текстовые метки: awk
Раздел: root - Linux - Console - awk

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.

 

Унарные операции *, +, ? имеют наивысший приоритет, затем конкатенация и затем альтернативный выбор |.

 

Таблица 22

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

Выражение Действие

с Любой, отличный от "с" мета-символ

\с Символ "с"

^ Начало строки

$ Конец строки

. Любой символ, кроме новой строки

[s] Любой символ из набора "s"

[^s] Любой символ, не входящий в набор "s"

r* Ноль или больше

r+ Один или больше

r? Ноль или один

(r) r

r1r2 Соединить r1 и r2

r1|r2 r1 или r2

← Содержание ...
 
MyTetra Share v.0.35
Яндекс индекс цитирования