Руководство пользователя для GNU Awk
4. Регулярные выражения
4.3 Операторы регулярных выражений
Можно комбинировать регулярные выражения с помощью указанных ниже символов, называемых операторами регулярных выражений или метасимволами, для увеличения возможностей и универсальности регулярных выражений.
Управляющие последовательности, описанные выше, в разделе 4.2 [Управляющие последовательности], стр. 24, действуют внутри regexp. Они вводятся с помощью `"'. Они распознаются и конвертируются в соответствующие реальные символы на самом первом шаге обработки regexp.
Приведем таблицу метасимволов. Все символы, не составляющие управляющие последовательности и которые не перечислены в таблицы, представляют сами себя.
" используется для уничтожения специального значения символа при установке соответствия.
Например, "$ означает символ `$'.
^ соответствует началу цепочки. Например, ^@chapter соответствует `@chapter' в начале цепочки и может использоваться для идентификации начала главы в исходных файлах Texinfo. `^' называется якорем, поскольку он побуждает образец сравниваться только с началом цепочки. Важно знать, что якорь `^' не соответствует началу строки, вложенной в цепочку.
В следующем примере условие не выполнено:
if ("line1"nLINE 2" ~ /^L/) ...
$ аналогично `^', но отмечает только конец цепочки. Например, p$ соответствует записи, которая оканчивается на `p'. `$' тоже якорь и тоже не означает конец строки, вложенной в цепочку.
В следующем примере условие имеет значение ложь:
if ("line1"nLINE 2" ~ /1$/) ...
. точка соответствует любому одиночному символу, включая символ newline. Например, .P соответствует любому одиночному символу, предшествующему в цепочке букве `P'.
Использую конкатенацию, мы можем строить регулярные выражения по примеру `U.A', представляющему любую трехсимвольную последовательность, начинающуюся с `U' и кончающуюся на `A'. В строгом режиме POSIX (см. раздел 14.1 [Параметры командной строки], стр. 161), `.' не соответствует пустому символу, все биты которого равны 0. В остальных случаях пустой символ рассматривается как обычный символ. Другие версии awk не могут обнаруживать пустой символ.
[...] называется списком символов. Он соответствует любому из символов, заключенных в квадратные скобки. Например, [MVX] соответствует любой из букв `M', `V' или `X' в цепочке. Диапазоны символов указываются с помощью дефиса между начальным и конечным символами и заключением всего выражения в квадратные скобки. Например, [0-9] означает любую цифру. Допустимы и кратные диапазоны. Например, список [A-Za-z0-9] есть обычный способ указания всех латинских букв и цифр.
Чтобы включить один из символов `"', `]', `-' или `^' в список символов, поставьте перед ним `"'.
Например:
[d"]] означает `d' или `]'.
Такое использование `"' в списке символов совместимо с другими реализациями awk и допускается в POSIX. Регулярные выражения в awk образуют супермножество спецификаций POSIX для Расширенных Регулярных Выражений (EREs). POSIX EREs основаны на регулярных выражениях, принятых в традиционных утилитах l egrep. Классы символов представляют новую черту, введенную в стандарт POSIX. Символьный класс есть специальное обозначение для описания списков символов, имеющих специальные атрибуты, но где сами фактические символы могут меняться от страны к стране и/или от одного символьного множества к другому. Например, понятие буквенного символа в США отличается от того же во Франции.
Символьный класс имеет смысл только в внутри скобок символьного списка. Символьный класс состоит из `[:', ключевого слова класса, и `:]'.
Приведем символьные классы, определенные в стандарте POSIX.
[:alnum:] Буквенно-цифровые символы.
[:alpha:] Буквенные символы.
[:blank:] Пробелы и знаки табуляции.
[:cntrl:] Управляющие символы.
[:digit:] Цифры.
[:graph:] Символы, которые и печатны и одновременно видимы. (Пробел
печатный, но невидимый, а `a' печатен и видим.)
[:lower:] Буквы нижнего регистра.
[:print:] Печатные символы (символы, не являющиеся управляющими.)
[:punct:] Знаки пунктуации (не буквы, цифры, управляющие или пробелы.)
[:space:] Знаки пробелов (пробел, tab, formfeed).
[:upper:] Буквы верхнего регистра.
[:xdigit:] Шестнадцатеричные цифры.
Например, до стандарта POSIX, для выделения букв и цифр нужно было писать /[A-Za-z0-9]/. Если ваше множество содержит и другие буквы, они не будут обнаружены. С помощью классов POSIX можно писать /[[:alnum:]]/, что будет отвечать всем буквам и цифрам вашего символьного множества.
Две дополнительные специальные последовательности могут фигурировать в символьных списках. Они относятся к не-ASCII символьным множествам, которые могут иметь отдельные символы (называемые упорядочивающими элементами), представляемые более чем одним символом, или группы символов, которые равнозначно используются в целях упорядочивания или сортировки. (Например, во Франции простое "e" и имеющее аксант-граф "`e" эквивалентны.)
Сортирующие символы (Collating Symbols)
Сортирующий символ есть многосимвольный упорядочивающий элемент, заключенный в `[.' и `.]'. Например, если `ch' есть упорядочивающий элемент, то [[.ch.]] есть regexp, которое соответствует этому упорядочивающему элементу, в то время как [ch] есть regexp, которое соответствует либо `c' либо `h'.
Классы эквивалентности
Класс эквивалентности есть региональное специальное имя для списка символов, которые эквивалентны. Это имя заключается в `[=' и `=]'. Например, имя `e' может использоваться для представления всех "e," "`e," и "'e." В таком случае [[=e]] есть regexp, соответствующий любому из `e', `'e', или ``e'. Эти черты очень ценны в не англоязычных регионах.
Внимание: библиотечные функции, которые gawk использует для регулярных выражений, соответствуют только признанным в POSIX классам символов; они не распознают упорядочивающих символов или классов эквивалентности. [^ ...] есть дополнение к списку символов (первый символ после `[' должен быть`^'). Оно соответствует любым символам кроме тех, которые находятся в квадратных скобках.
Например,
[^0-9] соответствует любому символу, кроме цифр.
-- представляет оператор альтернативы и
используется для указания альтернатив.
Например,
^P--[0-9] соответствует любой цепочке,
которая соответствует либо
`^P' либо `[0-9]'.
То есть это соответствует всякой цепочке,
которая начинается с `P' или содержит цифру.
Альтернатива связывает наибольшие возможные regexp с обеих сторон. Другими словами, `--' имеет наинизший приоритет среди всех операторов над регулярными выражениями.
Скобки (...) используются для группировок в регулярных выражениях, как и в арифметических. Они могут использоваться для конкатенации регулярных выражений, содержащих оператор альтернативы `--'. Например, `@(samp--code)"-[^""]+"""' соответствует как `@code-foo""' так и `@samp-bar""'. (Они являются форматирующими управляющими последовательностями для Texinfo.)
* Звездочка означает, что предшествующее регулярное выражение должно быть повторено столько раз, сколько необходимо для получения соответствия.
Например, ph* означает применение символа `*' к предшествующему `h' и соответствует `p' с следующими за ним любым количеством `h' ( в том числе и нулевым, то есть одному `p'). `*' повторяет наименьшее возможное предшествующее выражение (используйте скобки, если нужно повторить большее выражение) любое количество раз.
Например,
awk '/"(c[ad][ad]*r x")/ - print ""' sample
печатает каждую запись из `sample',
содержащую цепочку вида
`(car x)', `(cdr x)', `(cadr x)', и т. д.
Заметьте исключение скобок посредством
предварения их обратными слешами.
+ Этот символ действует подобно `*', но предшествующее выражение должно быть повторено по крайней мере один раз. Это значит, что wh+y соответствует `why' и `whhy', но не `wy', в то время как `wh*y' соответствует всем трем приведенным цепочкам.
Вот более простой способ записи последнего примера на `*' :
awk '/"(c[ad]+r x")/ - print ""' sample
? Этот символ также действует подобно `*', но предшествующее выражение повторяется или раз или ни разу. Например, fe?d соответствует `fed' и `fd', и ничему другому.
-n"" -n,"" -n,m"" Одно или два числа внутри фигурных скобок означают интервальное выражение. Если в фигурных скобках стоит одно число, предшествующее regexp повторяется n раз. Если там два числа, разделенные запятой, то предшествующее regexp должно повторяться от n до m раз. Если имеется одно число с последующей запятой, то предшествующее regexp должно повторяться не меньше чем n раз.
wh-3""y соответствует `whhhy', но не `why' или `whhhhy'. wh-3,5""y соответствует только `whhhy' или `whhhhy' или `whhhhhy'. wh-2,""y соответствует `whhy' или `whhhy', и т.д.
Интервальные выражения традиционно не использовались в awk. Как часть стандарта POSIX, они добавлены, чтобы сделать awk и egrep совместимыми друг с другом.
Однако, поскольку старые программы могут использовать `-' и `""' в константах regexp constants, по умолчанию gawk не обрабатывает интервальные выражения в regexp. Если указаны либо `--posix' либо `--re-interval' (см. раздел 14.1 [Параметры командной строки], стр. 161), то интервальные выражения допускаются в regexp.
В регулярных выражениях операторы `*', `+' и `?', также как и фигурные скобки `-' and `""', имеют наивысший приоритет, затем идет конкатенация и, наконец, `--'. Как и в арифметике, круглые скобки могут изменить порядок действий.
Если gawk дейсвует в режиме эмуляции (см. раздел 14.1 [Параметры командной строки], стр. 161), классы символов и интервальные выражения недопустимы в регулярных выражениях.
В следующем разделе обсуждаются специальные для GNU операторы регулярных выражений и рассматриваются детали того, как влияют параметры командной строки на способ интерпретации в gawk символов в регулярных выражениях.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|