Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metod_lab_OSUNIX_2006-ukr.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
759.81 Кб
Скачать

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

У мові awk є могутніші засоби пошуку символьних рядків, ніж оператори порівняння. Мова йде про регулярні вираження, найпростіша форма яких має вигляд рядка символів, укладених у середину кількох похилих рисок:

/Asia/

Така програма виведе список всіх вхідних рядків, що містять підрядок "Asia".

Для того, щоб установити відповідність із певним полем, використовуються оператори ~ (відповідає) і !~ (не відповідає). Програма

$4 ~ /Asia/ { print $1 }

виводить перше поле кожного запису, четверте поле якої містить значення "Asia".

6.3.8.5 Символи

\ ^ $ . [] * + ? () |

у регулярних вираженнях є метасимволами, що мають спеціальне значення. Так, метасимволи ^ і $ позначають початок і кінець рядка, відповідно, а метасимволом "." (крапка) позначається будь-який одиночний символ. Таким чином, рядок

/^.$/

позначає всі записи, що складаються рівно з одного символу.

Група символів, укладена у квадратні дужки, відповідає кожному із цих символів; наприклад, вираження /[ABC]/ означає вибірку записів, що містять у будь-якому місці хоча б один із символів "A", "B", "C". У квадратні дужки можна містити діапазони букв або цифр: рядку /a-zA-Z/ відповідає будь-яка поодинока буква.

Якщо після лівої дужки є символ "^", що означає доповнення до класу значень, вираження відповідає будь-якому символу, відсутньому в зазначеній послідовності: /[^a-zA-Z]/ відповідає будь-якому символу, крім букв. Програма

$2 !~ /^[0-9]+$/

виводить всі записи, у яких друге поле не є набором цифр (^ означає початок рядка, [0-9]+ означає одну й більше цифр, а $ - кінець рядка). Програми такого типу часто використовуються для перевірки правильності даних.

Круглі дужки означають угруповання, а символ | – можливість вибору. Програма

/(apple|cherry) (pie|tart)/

вибирає рядки, що містять хоча б одну з таких підрядків: "apple pie", "apple tart", "cherry pie" або "cherry tart".

Для того, щоб скасувати спеціальне значення метасимволу, необхідно поставити перед ним символ \ (зворотна похила риска). Таким чином, програма

/b\$/

виводить всі рядки, що містять кілька символів "b$".

Крім метасимволів команда awk розпізнає dсередині регулярних виражень і рядків такі esc-послідовності, прийняті в мові Сі:

\b повернення на один символ

\f прогін до кінця аркуша

\n новий рядок

\r повернення каретки

\t табуляція

\ddd вісімкове значення ddd

\" лапки

\c будь-який інший символ

Для виводу всіх рядків, що містять символ табуляції, можна використати вираження

/\t/

awk інтерпретує будь-який рядок або змінну справа від ~ і !~ як регулярне вираження. Так, наприклад, програму

$2 !~ /^[0-9]+$/

можна було б записати у такому вигляді

BEGIN { digits = "^[0-9]+$" }

$2 !~ digits

Припустимо, що потрібно знайти рядок символів ^[0-9]+$. Якщо рядок у лапках, подібний "^[0-9]+$", використовується як регулярне вираження, для захисту метасимволів, що входять у нього, потрібен додатковий рівень символів "\". Один рівень знімається під час початкового синтаксичного розбору рядка. Якщо зворотна похила риска потрібна для того, щоб скасувати спеціальне значення наступні за нею символу, виникає необхідність у використанні ще однієї зворотної похилої риски, що захищає першу.

Точна форма регулярних виражень і підрядків, їм відповідних, подана у таблиці 6.2. Унарні оператори *, + і ? мають найвище старшинство, потім іде конкатенація, а далі - вибір (|). Через "r" позначено будь-яке регулярне вираження.

Таблиця 6.2 – Регулярні вираження в мові awk

Вираження

Відповідає

c

\c

^

$

.

[s]

[^s]

r*

r+

r?

(r)

r1r2

r1|r2

будь-якому символу "c", що не є метасимволом

символу "c"

початку рядка

кінцю рядка

будь-якому символу, крім символу "новий рядок"

будь-якому символу з набору "s"

будь-якому символу, відсутньому в наборі "s"

жодне або будь-яке число появ r

одна й більше появ r

жодна або одна поява r

r

r1, за яким потрібно r2 (конкатенація)

r1 або r2 (вибір)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]