В данном случае отображается весь файл, причем перед строкой, содержащей слово "music", выводится ее номер. Из этого можно сделать заключение, что команда=выполняется перед тем, как текущая строка будет выведена на экран.
Если же требуется узнать только номер строки, задайте опцию -n:
$ sed -n '/music/=' quote.txt
2
Можно также отобразить и строку, и ее номер. Для этого следует воспользоваться опцией -e, позволяющей указать несколько команд подряд. Первая команда выводит строку, в которой найдено совпадение с шаблоном, а вторая — номер этой строки:
$ sed -n -e '/music/p' -e '/music/=' quote.txt
It was an evening of splendid music and company. 2
10.6. Добавление текста (команда а)
Для добавления текста предназначена команда a (append), которая вставляет одну или несколько строк текста после адресуемой строки. Формат команды таков:
[адрес]a\
текст\
текст\
текст
Адрес может быть представлен в виде номера строки либо регулярного выражения. Во втором случае найденных строк может быть несколько. При добавлении текста отсутствует возможность задать диапазон строк. Допускается указание только одного шаблона адреса. Если адрес, по которому помещается текст, не указан, тогда команда будет применена к каждой строке входного файла.
Обратите внимание на присутствие символа обратной косой черты в конце каждой добавляемой строки, а также после самой команды а. Этот метасимвол защищает от интерпретации символ новой строки. В последней строке указывать обратную косую черту не требуется, поскольку концевой символ новой строки в этом случае является признаком конца команды.
Добавляемый текст записывается в стандартный выходной поток и не дублируется во входном буфере, поэтому не подлежит редактированию, т. е. на него нельзя сослаться в последующих шаблонах поиска. Чтобы иметь возможность отредактировать полученный текст, необходимо сохранить результаты работы редактора sed в новом файле и применить команды редактирования уже к нему.
10.7. Создание файла сценария
Конечно, ввод многострочных команд в режиме командной строки не слишком удобен и чреват ошибками, поэтому лучше всего размещать такие команды в файлах сценариев. Кроме того, в сценариях допускается наличие пустых строк и комментариев, что облегчает восприятие самих сценариев.
Создайте новый файл с именем append.sed и добавьте в него показанные ниже команды:
$ cat append.sed
#!/bin/sed -f
/company/a\
Then suddenly it happened.
Теперь сделайте этот файл исполняемым:
$ chmod u+x append.sed
и запустите его на выполнение:
$ append.sed quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Then suddenly it happened.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P. Neave was in attendance.
Если вместо показанного результата будет выдано сообщение об ошибке "command not found" (команда не найдена), значит, переменная среды $PATH, которая содержит список имен каталогов, просматриваемых в поиске исполняемых файлов, не включает имя текущего каталога. В этом случае необходимо явно указать, что исполняемый файл находится в текущем каталоге:
$ ./append.sed quote.txt
Рассмотрим, что делает сценарий append.sed. Первая его строка является системной командой, которая указывает, какая программа выполняет данный сценарий. Формат этой команды мы уже рассматривали при знакомстве с файлами сценариев awk в предыдущей главе. Как и утилита awk, редактор sed, как правило, находится в каталоге /bin.
Далее в сценарии находится команда а, которая ищет во входном файле строку, содержащую слово "company", и вставляет после нее предложение "Then suddenly it happened".
10.8. Вставка текста (команда i)
Команда i (insert) аналогична команде а, только вставляет текст не после, а перед адресуемой строкой. Как и при добавлении текста, допускается указание только одного шаблона адреса. Ниже приведен общий формат команды:
[адрес]i\
текст\ текст\
текст
В следующем сценарии предложение "Utter contusion followed" вставляется перед строкой, содержащей слово "attendance":
$ cat insert.sed
#! /bin/sed -f /attendance/i\ "Utter confusion followed.
Результаты работы данного сценария будут такими:
$ insert.sed 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.
Utter confusion followed.
The local nurse Miss P. Neave was in attendance.
Для указания места вставки текста можно было бы воспользоваться номером строки, в данном случае 4:
#!/bin/sed -f
4i\
Utter confusion followed.
10.9. Изменение текста (команда с)
Команда с (change) заменяет новым текстом каждую адресуемую строку. Если выбрана группа строк, вся группа заменяется одной копией текста. Формат команды с таков:
[адрес1[,адрес2]]c\ текст\
текст\
текст
В следующем примере первая строга файла quote.txt заменяется новой строкой:
$ cat change.sed
#! /bin/sed -f
1c\
The Office Dibble band played well.
Прежде чем выполнять этот сценарий, не забудьте сделать его исполняемым:
$ chmod u+x change.sed $ change.sed quote.txt
The Office Dibble band played well. 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.
Команды изменения, добавления и вставки текста можно применять к одному и тому же файлу. Ниже приведен пример такого сценария, снабженный необходимыми комментариями:
$ cat mix.sed
#! /bin/sed -f
# Изменяем строку номер 1
1c\
The Dibble band were grooving.
# Вставляем строку
/evening/i\
They played some great tunes.
# Изменяем последнюю строку
3c\
Nurse Neave was too tipsy to help.
# Добавляем строку после строки номер 3
3a\
Вот что получится в результате выполнения этого сценария:
$ mix.sed quote.txt
The Dibbse band were grooving.
They played some great tunes.
It was an evening of splendid music and company
Too bad the disco floor fell through at 23:10.
Where was the nurse to help?
Nurse Neave was too tipsy to help.
10.10. Удаление текста (команда d)
Для удаления текста предназначена команда d (delete), имеющая следующий
формат:
'адрес1[, адрес2]'d
Адрес может быть указан в виде номера строки или регулярного выражения. Рассмотрим примеры. В первом из них будет удалена первая строка входного
файла:
$ sed '1d' quote.txt
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.
В следующем примере удаляются строки 1—3:
$ sed '1,3d' quote.txt
The local nurse Miss P. Neave was in attendance.
В этом примере удаляется последняя строка:
$ sed '$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.
Можно также удалить строку, в которой найдено совпадение с регулярным
выражением. В показанном ниже примере удаляется строка, содержащая слово '"Neave":