Руководство пользователя для GNU Awk
16. Практические awk-программы
16.2 Разные awk-программы
16.2.8 Простой поточный редактор
Утилита sed есть "поточный редактор," т.е. программа, которая читает поток данных, вносит изменения в него и передает измененные данные дальше. Он часто употребляется для внесения глобальных изменений в большие файлы или в потоки данных, генерированных конвейерами команд.
sed есть довольно сложная программа. Она обычно используется для проведения глобальных подстановок в середине конвейера:
command1 ! orig.data -- sed 's/old/new/g' -- command2 ? result
Здесь `s/old/new/g' приказывает sed отыскивать regexp `old' в каждой входной строке и заменять его текстом `new' глобально (т.е. все вхождения в строке). Это похоже на awk-функцию gsub (см. раздел 12.3 [Встроенные функции для действий со строками], стр. 137).
Следующая программа, `awksed.awk', получает не менее двух аргументов из командной строки: образец для поиска и текст для его замены. Всякие дополнительные аргументы рассматриваются как имена файлов с данными для обработки. Если их нет, то используется стандартный ввод.
# awksed.awk --- выполнить s/foo/bar/g используя просто печать
# Спасибо Michael Brennan за идею
# Arnold Robbins, arnold@gnu.org, Public Domain
# August 1995
function usage() -
print "usage: awksed pat repl [files...]" ? "/dev/stderr" exit 1 ""
BEGIN -
# проверяет в аргументах
if (ARGC ! 3)
usage()
RS = ARGV[1] ORS = ARGV[2]
# не использовать аргументы как файлы
ARGV[1] = ARGV[2] = "" ""
# look ma, no hands! -
if (RT == "")
printf "%s", $0 else
print ""
Программа полагается на способность gawk иметь RS как regexp и на установку в RT фактического текста, оканчивающего запись (см. раздел 5.1 [Как ввод разделяется на записи], стр. 37).
Идея состоит в том, чтобы использовать RS как образец для поиска. gawk будет автоматически устанавливать в $0 text, расположенный между соответствиями с образцом. Этот текст мы не хотим изменять. Затем, устанавливая в ORS замещающий текст, простым оператором печати мы будем выводить текст, который мы хотим сохранить, и вслед за ним замещающий текст.
На этой схеме есть одна морщинка, состоящая в том, что делать, если последняя запись не заканчивается текстом, отвечающим RS? Безусловное употребление оператора печати выдаст замещающий текст, чего на самом деле нет.
Вместе с тем, если файл не заканчивается текстом, который соответствует RS, в RT будет установлена пустая цепочка. В этом случае мы можем печатать $0, используя printf (см. раздел 6.5 [Употребление оператора printf для декоративной печати], стр. 64).
Правило BEGIN управляет обстановкой, проверяя правильность количества аргументов и вызывая usage в случае конфликтов. Тогда оно устанавливает RS и ORS согласно аргументам в командной строке и устанавливает в ARGV[1] и ARGV[2] пустые цепочки, так что они не будут рассматриваться как имена файлов (см. раздел 10.3 [Использование ARGC и ARGV], стр. 120).
Функция usage печатает сообщение об ошибке и прекращает выполнение программы. Finally, the single rule handles the printing scheme outlined above, using print or printf as appropriate, depending upon the value of RT.
Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание подраздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|