Вы здесь

Команды sed

Запуск

sed -i.bak -n -e 'cmd' -f cmdfile file1 file2...

По умолчанию, результат обработки выдаётся на стандартный вывод.

  • -i[ext] - редактирование файлов "на месте". Каждый файл обрабатывается отдельно. Результат сохраняется в тот же файл. Старое содержимое сохраняется в файле, к имени которого приписана строка ext.
  • -n - отмена автопечати обработанных строк. Для вывода строк необходимо явно указывать в скрипте команду p или аналогичную.
  • -e cmd - задание скрипта cmd в командной строке
  • -s cmdfile - чтение скрипта из файла cmdfile
  • file1 file2... - список входных файлов. При его отсутствии обрабатывается стандартный ввод.

Формат команд

[addr1 [,addr2]] C [options]

Адреса определяют строки, к которым должна быть применена команда. Если адрес не указан, то команда применяется ко всем строкам. Если указаны два адреса, то команда применяется ко всем строкам от addr1 до addr2 включительно. Адреса могут быть номерами строк (в том числе символ $ в качестве номера последней строки), регулярными выражениями в формате /re/ или \%re% (в этом случае % может быть заменён на любой символ). Запись addr! означает, что команду надо применять ко всем адресам, кроме указанного.

Команда кодируется одним символом. Опции зависят от типа выполняемой команды. Чтобы применить к одному адресу несколько команд, они могут быть сгруппированы с помощью фигурных скобок.

В файле отдельные команды могут располагаться в отдельных строках. При запуске однострочных программ команды отделяются точкой с запятой или передаются в виде последовательности опций -e 'cmd'

sed '1d;3d;s/abc/cde/'
sed -e '1d' -e '3,5d' -e '/start/{n;n;s/abc/cde/}'

Основной цикл

Редактор sed оперирует тремя объектами: входной поток строк, буфер строк (pattern space), буфер хранения (hold space), выходной поток. ( pattern space также переводят как "пространство регулярных выражений")

В цикле производятся следующие действия:

  • строка из входного потока читается в буфер строк. Из строки удаляется символ перевода строки;
  • к буферу строк последовательно применяются все команды с подходящими адресами (в том числе команды обмена между буфером строк и буфером хранения);
  • если не отключена автопечать, то содержимое буфера строк выводится в выходной поток. Туда же дописывается перевод строки;
  • буфер строк очищается и цикл повторяется.

Команды управления главным циклом

q # если не отключена автопечать, то вытолкнуть буфер строк в выходной поток,
  # завершить главный цикл
n # если не отключена автопечать, то вытолкнуть буфер строк в выходной поток,
  # загрузить из входного потока в буфер строк следующую строку,
  # продолжить выполнять команды уже с новым содержимым

Команды изменения строк

s/from\(.*\)/to\1/gi # замена регулярного выражения в буфере строк
y/abc/cde/ # Замена парных символов в буфере строк. Аналог команды tr.

Вставка/замена/удаление строк

text - последовательность строк, разделяемых комбинацией символов \<перевод строки>.

i  text # вывести в выходной поток указанный текст
a  text # вытолкнуть буфер строк в выходной поток,
        # затем вывести в выходной поток указанный текст
c  text # замена строк. Удалить строки в диапазоне из входного потока,
        # затем вывести в выходной поток указанный текст
d # очистить буфер строк и перейти на начало главного цикла
D # удалить первую строку в буфер строк
  # и перейти на начало главного цикла без считывания новой строки

Команды управления буферами

N # добавить в буфер строк перевод строки и следующую строку из входного потока
g # скопировать буфер хранения в буфер строк
G # добавить в буфер строк перевод строки и содержимое буфера хранения
h # скопировать буфер строк в буфер хранения 
H # добавить в буфер хранения перевод строки и содержимое буфера строк
x # поменять местами буфер строк и буфер хранения 

Если буфер хранения пуст, то команда G добавляет в буфер строк только перевод строки.

Печать

Опция -n отключает автоматический вывод результата в выходной поток. В этом случае команды печати надо указывать явно.

p # скопировать (не очищая) буфер строк в выходной поток
P # скопировать первую строку буфера строк в выходной поток
l # скопировать  буфер строк в выходной поток,
  # предварительно пометив конец строки знаком $,
  # и заменив непечатаемые символы их кодами в стиле языка Си
= # вывести номер текущей строки + перевод строки в выходной поток

Команды работы с файлами

r filename # вывести содержимое файла в выходной поток перед началом следующего цикла.
w filename # записать буфер строк в конец файла. При запуске скрипта файл обнуляется.

Метки и ветвления

: LABEL # метка
b [LABEL] # безусловный переход на метку, а при ее отсутствии на начало главного цикла
t [LABEL] # переход на метку в случае успешного выполнения хотя бы одной команды 's'.
        # При отсутствии метки переход на начало главного цикла
Яндекс.Метрика