Руководство пользователя для GNU Awk
8. Образцы и действия
8.1 Элементы образцов
8.1.4 Указание диапазонов записей с помощью образцов
Образец для диапазона образуется двумя образцами, разделенными запятой, вида `begpat, endpat'. Он определяет диапазон последовательных входных записей. Первый образец, begpat, определяет начало диапазона, а второй, endpat, определяет его конец.
Например,
awk '$1 == "on", $1 == "off"' печатает каждую запись внутри пар
`on'/`off', включая граничные случаи.
Образец диапазона начинает работу сравнением begpat с каждой входной записью; если запись соответствует begpat, образец диапазона переходит в состояние "on", а запись считается соответствующей диапазону. Пока остается состояние "on", образец автоматически соответствует каждой прочтенной записи. Также каждая читаемая запись проверяется на соответствие с endpat; если оно имеет место, образец диапазона переходит опять в состояние "off" для следующих записей, и затем опять начинается проверка на begpat для каждой записи.
Запись, которая включает образец диапазона, и та, которая его выключает, обе соответствуют образцу диапазона. Если вы не хотите учитывать эти записи, вы можете написать операторы if в правилах действия, чтобы отделить их от записей, представляющих интерес для вас. Для образца возможно быть включенным и выключенным одной и той же записью, если она удовлетворяет обоим условиям. Тогда действия выполняются только для этой записи.
Например, предположим что вы имеете текст между двумя одинаковыми маркерами (скажем, между символами `%'), который вы хотите игнорировать. Вы можете скомбинировать образец диапазона, который описывает выделенный текст, с оператором next (он еще не рассматривался, см. раздел 9.7 [Оператор next], стр. 111), который побуждает awk опустить всякую дальнейшую обработку текущей записи и начать с начала обработку следующей записи.
Такая программа может как будто выглядеть так:
/^%$/,/^%$/ - next ""
- print ""
Но эта программа терпит неудачу, потому что образец диапазона и включается и выключается первой строкой с `%' на ней. Для выполнения задачи нужно написать программу так, используя флажок:
/^%$/ - skip = ! skip;
next "" skip == 1 - next "" # пропустить строки с `skip' set
Заметим что в образце диапазона `,' имеет низший приоритет (вычисляется последней). Так, например, следующая программа пытается скомбинировать образец диапазона с другим, более простым тестом:
echo Yes -- awk '/1/,/2/ ---- /Yes/'
Автор этой программы предполагал, что она будет работать как
`(/1/,/2/) ---- /Yes/'. Однако, awk интерпретирует ее как
`/1/, (/2/ ---- /Yes/)'. Это не может быть изменено или работать дальше;
образцы диапазонов не комбинируются с другими образцами.
Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание подраздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|