Руководство пользователя для GNU Awk
2. Начальные сведения об awk
2.6 awk операторы над строками
Чаще всего каждая строка в awk-программе есть отдельный оператор или отдельное правило, подобно следующему:
awk '/12/ - print $0 ""
/21/ - print $0 ""' BBS-list inventory-shipped
Однако, gawk игнорирует переходы к новой строке после каждого из следующих
слов
, - ? : ---- &&
и делает newline в каждой точке, рассматриваемой как конец оператора. (Расщепление строк после `?' и `:' есть простейшее расширение gawk. Упомянутые здесь `?' и `:' есть трехоперандные условные выражения, описанные в разделе 7.12 [Условные выражения], стр. 92.) Если вы хотите расщепить единый оператор на две строки в точке, где переход к новой строке означал бы его конец, нужно продолжить его, закончив первую строку символом обратного слеш, `"'. Обратный слеш должен быть последним символом строки, чтобы быть распознанным как символ продолжения. Это разрешается абсолютно везде в операторе, даже внутри цепочки или регулярного выражения.
Например:
awk '/This regular expression is too long, so continue it"
on the next line/ - print $1 ""'
Мы, вообще говоря, не употребляем продолжения обратным слешем в примерах программ в этой книге. Поскольку в gawk нет ограничений на длину строки, это необязательно; но это облегчает чтение программы. По этой причине и для ясности мы ограничиваемся обычно короткими операторами в примерах программ, приведенных в книге. Продолжение через обратный слеш наиболее полезно, когда ваша awk-программа находится в отдельном исходном файле, а не печатается в командной строке. Надо также отметить, что многие реализации awk чувствительны к местам продолжения с помощью обратного слеш. Например, они могут не разрешать разрезать таким образом строковые константы. Поэтому, в целях максимальной переносимости ваших awk-программ, лучше не разрезать регулярные выражения или цепочки.
Внимание: продолжение с обратным слеш не работает, как описано выше, с оболочкой Си. Продолжение с обратным слеш работает в awk-программах в файлах и также в коротких программах при условии использования POSIX-подчиненной оболочки, такой как Bourne shell или Bash, GNU Bourne-Again shell. Но Си-оболочка (csh) ведет себя не так! Там вы должны взять два обратных слеш подряд и переход к новой строке. Заметим также, что при использовании Си-оболочки каждая newline в вашей awk-программе должна заканчиваться обратным слешем.
Например:
% awk 'BEGIN - " ? print "" ? "hello, world" "
? ""'
a hello, world
Здесь `%' and `?' есть первичная и вторичная подсказки Си-оболочки, аналогичные стандартным `$' и `?'.
awk представляет собой строко-ориентированный язык. Каждое действие правила должно начинаться на той же строке, что и образец. Чтобы иметь образец и действие в разных строках, нужно использовать продолжение обратным слешем, другого пути для этого нет.
Заметим, что продолжение обратным слешем и комментарии нельзя смешивать. Каждый `#' для awk есть начало комментария, он игнорирует остаток строки.
Например:
$ gawk 'BEGIN - print "dont panic" # a friendly " ? BEGIN rule ? ""'
error gawk: cmd. line:2: BEGIN rule error gawk: cmd. line:2: ^ parse error
Здесь кажется, что обратный слеш продолжает комментарий на следующую строку. Однако, комбинация обратный слеш-новая строка не замечается, так как относится к комментарию. Поэтому `BEGIN' отмечается как синтаксическая ошибка.
Когда awk-операторы в пределах одного правила коротки, вы можете разместить их более одного в строке. Для этого операторы разделяются точками с запятой `;'. Это также приложимо к самим правилам. Так, предыдущая программа может быть написана в форме:
/12/ - print $0 "" ; /21/ - print $0 ""
ЗАМЕЧАНИЕ: требование разделять правила в одной и той же строке двоеточиями отсутствовало в оригинальном языке awk; оно было добавлено для совместимости с трактовкой операторов внутри одного действия.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|