Содержание
Потоковый редактор sed
Один из долгожителей мира Unix, к сожалению позабытый инструмент эффективного решения множества задач, связанных с обработкой текста.
Основы языка
Так как sed — потоковый редактор, он выполняет действия со строками текста. Операции sed ориентированы на построчную обработку потока текста, поступающего на стандартный ввод или из файлов.
Входной текст поступает на стандартный ввод через конвеер. $ echo 'Hello!' | sed -n 'p;q'
Входной текст поступает из файлов. $ sed 's|^ooo:|qqq:|' /etc/passwd /etc/group
По умолчанию sed печатает все строки, поступающие на стандартный ввод. Это поведение отключается опцией «-n». Выходные строки sed печатает на стандартный вывод и может быть использован как часть конвеера оболочки. Это распространённый практический приём — использование sed в качестве фильтра.
Шаблоны
Все команды языка оперируют в контексте шаблона, который соотносится с входной строкой. Шаблон может отсутствовать вообще, такой пустой шаблон действует на любую строку. Не пустой шаблон может быть регулярным выражением, номером строки или диапазоном.
Печатается только первая строка из файла. $ sed -n '1p' /etc/passwd root:x:0:0:root:/root:/bin/bash $ Печатается только последняя строка из файла. $ sed -n '$p' /etc/fstab /dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0 $
Диапазон применяется ко всем строкам, которые попали в диапазон включительно. Диапазон начинается со строки, совпавшей с началом диапазона, и заканчиватся строкой, совпавшей с его концом. Далее sed выполняет повторное сканирование строк текста на предмет совпадения с началом диапазона.
Печатаются строки с 8 по 11. $ sed -n '8,11p' /etc/passwd lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh $
Печатаются строки из диапазона, заданного регулярным выражением. $ sed -n '/^lp/,/^uucp/p' lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh $
Команды редактирования
Строка, совпавшая с шаблоном, помещается в буфер шаблона. Предыдущее значение буфера затирается. Со строкой в буфере шаблона выполняются различные действия редактирования: удаление (d), добавление (a), вставка (i), замена (c). В буфер шаблона может быть считана следующая строка (n) с удалением предыдущего значения или с приписыванием к нему (N) с символом переноса строки ('\n') в качестве разделителя.
Во всех следующих примерах будет использоваться стихотворение А. С. Пушкина «Ангел» в переводе Е. Бонвера.
$ cat angel.txt By gates of Eden, Angel, gentle, Shone with his softly drooped head, And Demon, gloomy and resentful Over the hellish crevasse flapped. $
Удаление
Удаляются строки из диапазона с 1-й по 2-ю. $ sed '1,2d' angel.txt And Demon, gloomy and resentful Over the hellish crevasse flapped. $
Добавление
Строка добавляется после 4-й строки. $ sed '4aThe spirit of qualm and negation' angel.txt By gates of Eden, Angel, gentle, Shone with his softly drooped head, And Demon, gloomy and resentful Over the hellish crevasse flapped. The spirit of qualm and negation $
Вставка
Строка добавляется до 4-й строки. $ sed '4iThe spirit of qualm and negation' angel.txt By gates of Eden, Angel, gentle, Shone with his softly drooped head, And Demon, gloomy and resentful Over the hellish crevasse flapped. The spirit of qualm and negation $
Замена
Строка вставляется вместо 4-й. $ sed '4cThe spirit of qualm and negation' angel.txt By gates of Eden, Angel, gentle, Shone with his softly drooped head, And Demon, gloomy and resentful The spirit of qualm and negation
Команда подстановки
Наиболее употребительна команда подстановки (s), которая также действует с буфером шаблона. Действие команды подстановки изменяется дополнительными флагами. Например, действие подстановки можно повторить нерекурсивно ко всей строке множество раз (g), при подстановке выводить строку, если регулярное выражение подстановки дало совпадение (p).
Управляющие конструкции
Команды группируются для применения к одному шаблону в фигурных скобках (`{`…`}`). Команды, следующие друг за другом при группировке разделяются точкой с запятой (;). Если после шаблона поместить восклицательный знак (!), то следующие команды будут применены к не совпавшим с ним строкам. Это знак инверсии шаблона.
Буфер удержания
Буфер шаблона можно сохранить в буфере удержания. Для этого имеется четыре команды: копировать в буфер удержания с затиранием (h) и без затирания с приписыванием через символ новой строки (H), поместить содержимое буфера удержания в буфер шаблона с затиранием (g) и без затирания (G). Ещё одна команда позволяет обменять значения буферов удержания и шаблона (x).
Метки и переходы
Язык sed позволяет организовывать циклы.
Для этого в нём имеются команды установки метки (:<label>), безусловного перехода на метку (b<label>), и условного перехода (t<label>). Последняя проверяет флаг, устанавливающийся при любых успешных подстановках для текущей входной строки; если таковые имели место, то выполняется переход на метку. Флаг сбрасывается при чтении следующей строки или при выполнении команды условного перехода (t).
КатегорияЯзыкиПрограммирования