Шрифт:
a\ | Добавлять строки к выходному потоку, пока одна из них не закончится на \ |
b label | Перейти на команду: label |
c\ | Заменить строки на последующий текст, как в команде a |
d | Удалить строку; прочесть следующую входную строку |
i\ | Вставить последующий текст перед следующим выходным потоком |
l | Выдать строку, напечатав все невидимые символы |
p | Выдать строку |
q | Выйти |
r file | Читать file , содержимое его переслать в выходной поток |
s/old/new/f | Заменить old на new . Если f =g , заменить все вхождения; f =p , вывод; f =w файл, запись в файл |
t label | Проверка: переход на метку, если была замена в текущей строке |
w file | Записать строку в файл |
y/str1/str2/ | Заменить каждый символ строки str1 на соответствующий символ строки str2 (диапазоны недопустимы) |
= | Выдать текущую нумерацию входной строки |
!cmd | Выполнить команду sed cmd , только если строка не выбрана |
: label | Установить метку для команд b и t |
{ | Команды до соответствующей скобки } рассматривать как группу |
Таблица 4.2: Сводка команд sed
Редактор
sed
удобен потому, что позволяет работать с произвольно длинными входными строками. Это "быстрый" редактор, который сходен с редактором ed
в интерпретации регулярных выражений и в обработке отдельных строк. Однако, с другой стороны, его возможности запоминания ограничены (трудно запомнить текст от одной строки до другой) — делается только один проход по данным, нельзя двигаться назад, нет способов прямой адресации типа /.../+1:
и нет средств для работы с числами, т.е. он является чисто текстовым редактором. Упражнение 4.5
Измените команды
older
и newer
так, чтобы они не включали файл-аргумент в свой выходной поток. Измените их так, чтобы файлы выдавались в обратном порядке. Упражнение 4.6
С помощью редактора
sed
сделайте программу bundle
совершенно надежной. Подсказка: в конструкции "документ здесь" слово, отмечающее конец данных, распознается только в том случае, когда оно совпадает со строкой полностью. 4.4 Язык
awk
поиска и обработки шаблонов Некоторые ограничения
sed
преодолены в программе awk
. Принцип работы этой программы сходен с принципом работы программы sed
, но синтаксически она ближе к языку программирования Си, чем к текстовому редактору. Способ задания команды такой же, как и для sed
:
$ awk 'программа' имена_файлов...
но программа другая:
шаблон {действие}
шаблон {действие}
...
Программа
awk
читает входной поток по одной строке из указанных файлов. Строки сопоставляются с шаблонами по порядку; для каждого шаблона, соответствующего строке, выполняется необходимое действие. Как и в редакторе sed
, входные файлы здесь не изменяются. Шаблоны могут быть регулярными выражениями в
sed
или более сложными условиями, напоминающими язык Си. Приведем простой пример (такого же результата можно добиться с помощью команды egrep
):
$ awk '/регулярное_выражение/ {print}' имена_файлов...
Печатается каждая строка, соответствующая регулярному выражению.
Шаблоны или действия могут отсутствовать. Если отсутствует действие, то по умолчанию печатаются строки, соответствующие шаблону, поэтому команда
$ awk '/регулярное_выражение/' имена_файлов...
эквивалентна предыдущей. Наоборот, если отсутствует шаблон, то действие выполняется для каждой входной строки. Следовательно, команда
$ awk '{print}' имена_файлов...
дает те же результаты, что и команда
cat
, хотя действует медленнее. Теперь перейдем к более интересным примерам, но прежде сделаем одно замечание. Как и в случае
sed
, программу команды awk
можно получать из файла:
$ awk -f кмд файл имена_файлов...
Поля. В программе
awk
каждая входная строка автоматически разбивается на поля, т.е. последовательности символов без пробелов, разделенные пробелами и символами табуляции. По этому определению выходной поток команды who
имеет пять полей:
$ who
you tty2 sep 29 11:53
jim tty4 sep 29 11:27
$
Поля обозначаются как
$1
, $2
, …, $NF
, где NF
— переменная, значение которой установлено равным числу полей. В нашем случае NF=5
для обеих строк. (Учтите разницу между NF
, числом полей и $NF
— последним полем строки. В отличие от интерпретатора в программе awk
только номера полей начинаются с $
; переменные не имеют такого префикса.) Например, следующая команда выдаст поле "размер файла" из результата выполнения команды du -а