Цель работы: освоить базовые принципы работы с потоковым редактором sed.
Редактор sed (Stream EDitor) не является текстовым редактором в обычном понимании. Он представляет собой средство преобразования и отбора данных, поступающих из стандартного ввода. Пользователю достаточно задать последовательность команд для обработки, всю остальную работу sed выполнит за один проход автоматически. При этом исходные файлы остаются без изменения, копия стандартного ввода помещается в буфер редактирования, а изменения перенаправляются на стандартный вывод (по умолчанию) или в файл.
Общий синтаксис использования редактора имеет вид:
sed [options] 'command' [files].
Команды редактирования command рекомендуется заключать в одинарные кавычки, чтобы избежать интерпретации специальных символов.
В качестве options могут выступать:
-n — отключает вывод в стандартный поток. По умолчанию отображается каждая входная строка. Осуществить вывод нужных строк в дальнейшем можно с помощью команды p;
-e — следующей будет команда редактирования. Если используется одна команда, эту опцию указывать необязательно.
Общий синтаксис command следующий:
[addr1,[addr2]][!]command [arguments],
где addr1, addr2 — номера (адреса) строк, над которыми выполняются преобразования, command — односимвольная команда редактирования, arguments — аргументы (требуются некоторым командам).
Указание адреса может иметь вид:
n — строка с номером n;
n,m — все строки с номерами в диапазоне от n до m;
$ — последняя строка;
/pattern/ — все строки, соответствующие базовому регулярному выражению pattern.
Символ ! после указания адреса означает, что будет производиться редактирование строк, не соответствующих диапазону.
Основными односимвольными командами являются p,=,a,i,d,s,q:
[addr1,[addr2]]p — вывод указанных строк;
[addr]= — вывод номеров строк;
a — добавление одной или нескольких строк текста после адресуемой строки; общий синтаксис команды
[addr]a\
text\
text\
…
text
Здесь addr может быть либо номером строки, либо регулярным выражением. В последнем случае строк может быть несколько. Диапазон адресов указать нельзя.
i— вставка текста перед строкой. Работа аналогична предыдущей команде. Общий синтаксис;
[addr]i\
text\
text\
…
text
[addr1,[addr2]]d — удаление строк;
[addr1,[addr2]]s/pattern1/pattern2[flag] — замена указанного шаблона pattern1 заданным текстом pattern2. В качестве flag может быть указано:
g — замена каждого совпадения с pattern1 (по умолчанию производится только первая подстановка);
p — вывод на экран строки, в которой была сделана подстановка. Если подстановок было несколько, то строка будет выведена соответствующее количество раз.
[addr]q — завершение работы после того, как была достигнута адресуемая строка.
Обычно при работе с sed указывается больше, чем одна команда. Несколько команд редактора можно объединить в группу двумя способами:
[addr1,[addr2]]{command1; command2;… commandN;}
или
[addr1,[addr2]]{
command1
command2
…
commandN
}
Первый способ больше подходит для набора в командной строке, второй предназначен для записи команд редактора в сценарий.
Примеры:
sed -n '1,10p' textfile — вывод первых 10 строк файла textfile.
sed -n '1,10/Stop/p' textfile — вывод строк из диапазона первых 10 строк, в которых содержится буквосочетание Stop.
sed 's/\.\!/g' textfile — замена всех точек символом !.
echo $PWD | sed 's/^\///g' — удаление начального слэша из имени текущего каталога (замена экранированного символа / на пустую подстроку. Флаг g указывает, что необходимо выполнить все замены).