Есть 2 способа вызова sed: или указать Ваши инструкции для редактирования в командной строке или поместить их в файл и подставить имя файла.

2.3.1 Написание простых инструкций

Вы можете написать простые команды редактирования в командной строке

sed [-e] 'инструкции' файл

Опция -е необходима только когда Вы подставляете больше одной инструкции в командной строке. Она говорит sed'у интерпретировать следующий аргумент как инструкцию. Когда инсрукция одиночная, sed может определить это сам. Давайте рассмотрим несколько примеров.

Воспользуемся простым входым файлом, списком, следующий пример использует команду замены для замены "MA" на "Massachusetts."

$ sed 's/MA/Massachusetts/' list

John Daggett, 341 King Road, Plymouth Massachusetts

Alice Ford, 22 East Broadway, Richmond VA

Orville Thomas, 11345 Oak Bridge Road, Tulsa OK

Terry Kalkas, 402 Lans Road, Beaver Falls PA

Eric Adams, 20 Post Road, Sudbury Massachusetts

Hubert Sims, 328A Brook Road, Roanoke VA

Amy Wilde, 334 Bayshore Pkwy, Mountain View CA

Sal Carpenter, 73 6th Street, Boston Massachusetts

Three lines are affected by the instruction but all lines are displayed.

Выделение инструкций в одиночные кавычки не обязательно в всех случаях, но Вам следует завести привычку всегда их ставить. Выделение одинарными кавычками предотвращает интерпретацию шеллом специальных символов или пробелов, найденых в инструкциях редатирования. (Шелл использует пробелы для разделения отдельных аргументов отправляемых программе; специальные символы шелла разворачиваются до вызова команды.

Например, первый пример можно использовать без них, но в следующем примере они необходимы, т.к. команда замены содержит пробелы:

$ sed 's/ MA/, Massachusetts/' list

John Daggett, 341 King Road, Plymouth, Massachusetts

Alice Ford, 22 East Broadway, Richmond VA

Orville Thomas, 11345 Oak Bridge Road, Tulsa OK

Terry Kalkas, 402 Lans Road, Beaver Falls PA

Eric Adams, 20 Post Road, Sudbury, Massachusetts

Hubert Sims, 328A Brook Road, Roanoke VA

Amy Wilde, 334 Bayshore Pkwy, Mountain View CA

Sal Carpenter, 73 6th Street, Boston, Massachusetts

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

Существует три способа указать множественные инструкции в командной строке:

1. Разделить инструкции через точку с запятой.

sed 's/ MA/, Massachusetts/; s/ PA/, Pennsylvania/' list

2. Перед каждой инструкцией написать -e.

sed -e 's/ MA/, Massachusetts/' -e 's/ PA/, Pennsylvania/' list

3. Использовать многострочную возможность Bourne шелла.[1] Нажать RETURN после ввода одиночной кавычки и вторая строка (>) будет показана для многострочного ввода.

[1] В наши дни, многие шеллы совместимы с Bourne shell и работают как показанные здесь: ksh, bash, pdksh, and zsh, и другие.

$ sed '

> s/ MA/, Massachusetts/

> s/ PA/, Pennsylvania/

> s/ CA/, California/' list

John Daggett, 341 King Road, Plymouth, Massachusetts

Alice Ford, 22 East Broadway, Richmond VA

Orville Thomas, 11345 Oak Bridge Road, Tulsa OK

Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania

Eric Adams, 20 Post Road, Sudbury, Massachusetts

Hubert Sims, 328A Brook Road, Roanoke VA

Amy Wilde, 334 Bayshore Pkwy, Mountain View, California

Sal Carpenter, 73 6th Street, Boston, Massachusetts

Такая техника не будет работать в C shell. Вместо использования точки с запятой в конце каждой инструкции Вы можете вводить команды поверх многострочкости, завершая каждую строка бекслешем. (или Вы можете на время запустить Bourne shell введя sh и затем набрать команду.)

В показанном выше примере изменению подверглись пять строк и, разумеется, все строки были показаны. Запомните, что никаких изменений во входном файле не произошло.

2.3.1.1 Искажение команд

Синтаксис sed команд может быть подробным и легко ошибитсья или пропустить обязательный элемент. Посмотрим, что происходит, когда неполный синтаксис введен:

$ sed -e 's/MA/Massachusetts' list

sed: command garbled: s/MA/Massachusetts

Sed будет обычно показывать любую строку, которую не смог выполнить, но он не скажет Вам что не так с командой.[2] В этом примере, слеш, кототорый помечает поиска и заменяемый раздел команды, пропущен в конце команды замены.

[2] Некоторые производители имеют улучшения. Для примера в SunOS 4.1.x, sed напишет "sed: Ending delimiter missing on substitution: s/MA/Massachusetts".

GNU sed поможет больше:

$ gsed -e 's/MA/Massachusetts' list

gsed: Unterminated `s' command

2.3.2 Файлы скриптов

Не практично вводить длинные скрипты для редактирования в командной строке. Похтому обычно лучше создать файл скрипта, который содержит инструкции для редактирования. Скрипт это простой набор команд sed которые выполняются по порядку в котором идут. Этот способ использует опцию -f, с помощью которой Вы указываете имя файла скриптав командной строке.

sed -f scriptfile file

Все команды редактирования, которые мы хотим выполнить помещаются в файл . Мы следуем правилу создания временных скриптов и назовем его sedscr.

$ cat sedscr

s/ MA/, Massachusetts/

s/ PA/, Pennsylvania/

s/ CA/, California/

s/ VA/, Virginia/

s/ OK/, Oklahoma/

Следующая команда читает все команды замены в sedscr и применяет их к каждой строке во входном фале списка:

$ sed -f sedscr list

John Daggett, 341 King Road, Plymouth, Massachusetts

Alice Ford, 22 East Broadway, Richmond, Virginia

Orville Thomas, 11345 Oak Bridge Road, Tulsa, Oklahoma

Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania

Eric Adams, 20 Post Road, Sudbury, Massachusetts

Hubert Sims, 328A Brook Road, Roanoke, Virginia

Amy Wilde, 334 Bayshore Pkwy, Mountain View, California

Sal Carpenter, 73 6th Street, Boston, Massachusetts

И снова результат недолговечный, отображается на экран. Не изменяя входной файл.

Если sed скрипт может быть использован повторно, то Вам следует переименовать его и сохранить. Скрипт прошедший испытания может быть сохранен в личной или общесистемной библиотеке.

2.3.2.1 Сохранение вывода

Пока Вы не отправляете вывод sed в другу программу, Вы можете захотеть направить выход в файл. Это можно сделать используя один I/O символ перенаправления, за которым идет имя файла:

$ sed -f sedscr list > newlist

Не направляйте вывод в файл, который Вы редатируете или Вы повредите его. ( ">"
оператор перенаправления отсекает файл, до того, как шелл что либо сделает.) Если Вы хотите, чтобы выходной файл заменил входной, Вы можете сделать это отдельно, используя команду mv. Но сначала убедитесь, что Ваш скрипт для редактирования отработал правильно!

В главе 4, Написание sed скрипов, мы рассмотрим шелл скрипт названный runsed, который автоматически выполняет создание временного файли и использует mv для перезаписи оригинального файла.

2.3.2.2 Подавление автоматического отображения входных строк

По-умолчанию sed выводит каждую входную строку. Опция -n отключает автоматический вывод. Когда указана эта опция, каждая инструкция, преднозначенная производить вывод должна содержать команду p. Рассмотрим следующий пример.

$ sed -n -e 's/MA/Massachusetts/p' list

John Daggett, 341 King Road, Plymouth Massachusetts

Eric Adams, 20 Post Road, Sudbury Massachusetts

Sal Carpenter, 73 6th Street, Boston Massachusetts

Сравним вывод с первым примером в этой главе. Здесь только строки, которые были указаны командой печати.

2.3.2.3 Смешивание опций (POSIX)

Вы можете построить скрипт, совмещая обе опции -е и -f в командной строке. Скрипт представляет комбинацию всех команд в указанном порядке. Это поддерживается в UNIX версиях sed, но эта особенность не полностью описана в страницах man. POSIX стандарт явно описивыет такое поведение.

2.3.2.4 Суммирование опций

Таблица 2.1 краткий список опций sed в командной строке.

Опция

Пояснение

-e Далее следуют инструкции редактирования

-f Далее следует имя файла скрипта

-n Подавление автоматического вывода входных строк.

Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется

Переведено на Нотабеноиде
http://notabenoid.org/book/32181/114521

Переводчики: r0mk