Есть 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