$ sed '/Neave/d' quote.txt
The honeysuckle band played all night long for only $90
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
10.11. Замена подстроки (команда s)
Команда s (substitute) осуществляет во всех адресуемых строках замену подстроки, соответствующей заданному шаблону, указанной подстрокой. Формат команды
таков:
[адрес1[, адрес2]]s/шаблои_поиска/шаблбон_замены/[флаги]
Ниже перечислены возможные флаги:
g
Замена в адресуемой строке каждой подстроки, соответствующей шаблону (по умолчанию заменяется лишь самая первая подстрока каждой адресуемой строки)
n
Замена n–й подстроки, соответствующей шаблону (n — любое число в диапазоне от 1 до 512)
p
Вывод на экран строки, в которой была произведена замена; если в строке сделано несколько замен, она будет отображена соответствующее число раз
w имя_файла
Запись измененной строки в указанный файл
В следующем примере осуществляется замена слова "night" словом "NIGHT":
$ sed -n 's/night/NIGHT/p' quote.txt
The honeysuckle band played all NIGHT long for only $90.
Если требуется удалить из строки символ '$', оставьте шаблон замены пустым (не забывайте, что в редакторе sed знак доллара является метасимволом, поэтому он должен быть защищен обратной косой чертой).
$ sed -n 's/\$//р' quote.txt
The honeysuckle band played all night long for only 90.
Флаг g (global) позволяет выполнить глобальную подстановку шаблона замены на место шаблона поиска в пределах каждой адресуемой строки. Предположим, например, что мы хотим заменить все точки в файле quote.txt восклицательными знаками. Следующая команда выполнит работу не полностью:
$ sed 's/\./!/' quote.txt
The honeysuckle band played all night long for only $90!
It was an evening of splendid music and company!
Too bad the disco floor fell through at 23:10!
The local nurse Miss P.Neave was in attendance.
Обратите внимание на последнюю строку: в ней точка встречается дважды, но замене подвергся только первый символ. Для исправления подобной ситуации нужно указать флаг g:
$ sed 's/\./!/g' quote.txt
The honeysuckle band played all night long for only $90!
It was an evening of splendid music and company!
Too bad the disco floor fell through at 23:10!
The local nurse Miss P! Neave was in attendance!
С помощью флага w (write) можно указать файл, в который будут записаны все модифицируемые строки. В показанном ниже примере осуществляется замена слова
"splendid" словом "SPLENDID", а все строки, где была выполнена эта замена, помещаются в файл sed.out.
$ sed -n 's/splendid/SPLENDID/w sed.out' quote.txt
Вот каким будет содержимое этого файла:
$ cat sed.out
It was an evening of SPLENDID music and company.
Ссылка на искомую подстроку с помощью метасимвола &
Метасимвол & позволяет сослаться в шаблоне замены на подстроку, соответствующую шаблону поиска. Например, в следующей команде слово "Miss" либо "miss" заменяется фразой "lovely Miss Joan" или "lovely miss Joan" соответственно:
$ sed -n 's/[Mm]iss/lovely & Joan/p' quote.txt
The local nurse lovely Miss Joan P. Neave was in attendance
Заметьте, что пробелы также являются частью шаблона замены.
10.12. Вывод строк в файл (команда w)
Подобно тому как оператор > применяется для перенаправления результатов работы программы в файл, команда w (write) редактора sed позволяет записать в указанный файл строки, отобранные по заданному шаблону адреса. Формат этой команды таков:
[адрес1[, адрес2]]w имя_файла
Если файл не существует, он будет создан, если существует — его содержимое будет перезаписано. Если в сценарии встречается несколько команд w, направляющих результаты в один и тот же файл, данные всех команд, кроме первой, будут добавляться в конец файла.
Рассмотрим пример:
$ sed '1,2w sed.out' quote.txt
Здесь содержимое файла quote.txt выводится на экран, а строки с номерами 1 и 2 отправляются в файл с именем sed.out.
$ cat sed.out
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company,
В следующем примере осуществляется поиск строки, содержащей слово "Neave", и если такая строка найдена, она записывается в файл sed.out.
$ sed -n '/Neave/w sed.out' quote.txt
$ cat sed.out
The local nurse Miss P. Neave was in attendance.
10.13. Чтение строк на файла (команда r)
В процессе обработки входного файла редактор sed позволяет читать текст из другого файла и добавлять его к текущему содержимому буфера, размещая после каждой строки, соответствующей шаблону адреса. Формат предназначенной для этого команды r (read) таков:
[адрес]r имя_файла
Давайте создадим небольшой файл с именем sedex.txt.
$ cat sedex.txt
Boom boom went the music.
В следующем примере содержимое этого файла выводится на экран после строки файла quote.txt, содержащей слово "company":
$ sed '/company/r sedex.txt' quote.txt
The honeysuckle band played all night for only $90.
It was an evening of splendid music and company.
Boom boom went the music.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P. Neave was in attendance.
10.14. Досрочное завершение работы (команда q)
Иногда требуется завершить работу редактора sed сразу же после нахождения первого совпадения с шаблоном. Эту задачу решает команда q (quit), имеющая следующий формат:
[адрес]q
Обратимся к примеру. Допустим, требуется осуществить поиск строки, содержащей такой шаблон:
/\<.a.\{0,2\}\>/
Этому шаблону соответствует любое слово (выражение \< обозначает начало слова, а выражение \> — его конец(, в котором вторым символом является буква 'a', а за ней идет не более двух символов. В файле quote.txt таких слов четыре:
• строка 1 — band,
• строка 2 — was,
• строка 3 — bad,
• строка 4 — was.
Показанная ниже команда находит строку, в которой шаблон встречается первый раз, после чего завершает работу:
$ sed */\<.a.\{0,2\)\>/q' quote.txt
The honeysuckle band played all night long for only $90.
10.15. Отображение управляющих символов (команда l)
Иногда даже в текстовых файлах содержатся различного рода непечатаемые символы. Это может быть следствием неправильного ввода данных в текстовом редакторе или ошибок конвертации при загрузке файлов из других систем. При выводе таких файлов. на экране могут быть получены странные результаты, когда вместо непечатаемого символа отображается один или несколько обычных символов непонятного происхождения. Разобраться в таких ситуациях помогает команда cat -v, которая помечает начало замещающей последовательности символом '^' (знак крышки). Предположим, вы обнаружили незнакомый файл func.txt и хотите узнать его содержимое:
$ cat func.txt
This is the F1 key:P This is the F2 key:Q
Символы 'P' и 'Q' на концах строк кажутся подозрительными. Попробуем применить команду cat -v:
$ cat -v func.txt
This is the Fl key:^[OP This is the F2 key:^[OQ
Так и есть! Это не буквы 'Р и 'Q', а управляющие символы, хотя и непонятно, с помощью каких клавиш они были сгенерированы.