Команды редактирования sed

Программа редактирования, которую интерпретирует sed, состоит из одной или более команд редактирования, которые могут находиться как в командной строке, так и в файле, который указан в командной строке (параметры -e, -f, -expression, -file).

 

Каждая команда редактирования состоит из следующих частей:

 

 

Адрес во вводном тексте

Адресация элементов текста может быть в одной из нижеследующих форм:

 

number

Определение номера вводной строки number указывает только одну строку с номером number. Заметим, что sed постоянно считает номера строк начиная с первой введенной строки вне зависимости от количества вводных файлов.

 

$

Этот символ означает последнюю строку в последнем вводимом файле.

 

/regexp/

Этот адрес соответствует всем строкам вводного файла, содержание которых удовлетворяет регулярному выражению regexp. Если внутри регулярного выражения должна использоваться косая черта (/), то следует использовать комбинацию /.

 

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

 

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

 

Часто используемые команды

 

#

Комментарий; продолжается до конца. В первой строке скрипта sed два символа идущие подряд #n имеют специальное значение: будет включен режим no-autoprint.

 

s/regexp/replacement/flags

 

sed будет искать части строк вводного потока, которые соответствуют регулярному выражению regexp и производить замены этих частей на значение replacement в соответствии со значением flags.

Значение replacement может содержать выражения вида n, где n есть целое от 0 до 9. Такое выражение означает ту порцию соответствия, которая заключена в n-ные по порядку специальные скобки вида ( и ). Кроме этого, внутри выражения replacement может содержаться символ &, который ссылается на полную подстроку соответствующую regexp в основном буфере. Если вы хотите ввести в replacement литеральные символы, то следует использовать перед ними знак (обратный слеш). Пример:

 

$ echo "Жужжали" | sed -n 's/Жуж/Гуж<&>/p'

Гуж<Жуж>жали

 

$ echo "Жужжали Бабочки" | sed -n 's/(жж)(али)/Гуж<&>21/p'

ЖуГуж<жжали>алижж Бабочки

 

Замечания.

Символ / (наклонная черта) может быть заменен на любой другой символ в пределах одной команды s.

 

За командой редактирования s могут следовать (или не следовать) флаги, к обсуждению которых мы переходим.

 

g

Произвести замену во всех местах, а не только первой встреченной подстроки в строке.

 

p

Если замена имела место, то вывести результат.

 

number

Заменить только number-ное соответствие regexp.

 

w file-name

Если подстановка имела место, то результат записать в файл с именем file-name.

 

I

Проверять соответствие regexp вне зависимости от регистра (расширение GNU).

 

q

Выйти из sed без обработки остальных команд редактирования или вводного потока.

 

d

Очистить основной буфер и немедленно начать новый цикл обработки (чтение вводного потока, редактирование и т.д.).

 

p

Вывести основной буфер. Эта команда используется обычно в сочетании с параметром -n в командной строке.

 

n

Если режим auto-print не выключен, вывести основной буфер на устройство стандартного вывода, затем ввести в основной буфер следующую строку из вводного потока. Если вводной поток завершён (больше нет записей на вводе), тогда sed завершает своё выполнение без обработки остальных команд в случае их наличия.

 

Прочие команды sed

 

y/source-ch ars/dest-chars/

Заменить во водном потоке любой символ из source-chars на соответствующий ему символ из dest-chars. Другими словами, третий символ из source-chars заменить на третий символ из dest-chars. Строки source-chars и dest-chars должны содержать одинаковое число символов. Например, команда

echo жужжал | sed y/жул/gul/

даст в результате

guggаl

 

=

Вывести номер текущей вводной строки.

 

l

Вывести основной буфер в стандартной форме: не изображаемые символы выводятся в виде восьмеричных кодов, которым предшествует обратный слеш; длинные строки будут разбиты на более мелкие строки (места разбиения будут показаны обратными слешами); конец строки отмечается символом $ (знак доллар). Например,

$ echo "ЖужжалиБабочкиЖужжалиБабочки" | sed -n l

366325326326301314311342301302317336313311366325326

326301314311342301302317336313311$

 

r filename

Прочесть файл с именем filename и поместить его в выводной поток в очередном цикле чтения вводного потока.

 

w filename

Записать основной буфер в файл с именем filename.

 

D

Удалить текст из основного буфера до первого конца строки. Если в основном буфере остался какой-то текст, то перейти к его обработке. В противном случае перейти к новому циклу, т.е. чтению очередной строки из вводного потока и т.д.

 

Команды программирования, которые понимает sed

Использование команд программирования может потребоваться в специальных случаях.

 

: label

(Не разрешается использовать поле адреса.)

Определить положение метки с именем label.

 

b [label]

Безусловный переход к метке с именем label. Если имя метки опущено, то производится переход к следующему циклу обработки вводных строк.

 

t [label]

Условный переход к метке с именем label. Переход выполняется в том случае успешного выполнения команды s (подстановки) с момента последнего ввода очередной строки текста или выполнялась команда условного перехода t. Если имя метки опущено, то производится переход к следующему циклу обработки вводного потока.