Выбрать главу

$ 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', а управляющие символы, хотя и непонятно, с помощью каких клавиш они были сгенерированы.

Аналогичным образом будет вести себя и редактор sed при работе с данным; файлом. Если вы попытаетесь просмотреть его содержимое, будет выдано следующее:

$ sed -n '1,$p' func.txt

This is the F1 key:P This is the F2 key:Q

В редакторе существует команда l (list}, аналог рассмотренной выше команды cat -v. Формат команды l таков:

[адрес1[,адрес2]]l

Ее действие равносильно применению команды p, но при этом все непечатаемые символы заменяются восьмеричными ASCII–кодами (кроме того, длинные строки, выходящие за пределы экрана, разбиваются на части, а конец каждой строки помечается символом '$'). Вот что получится, если применить эту команду к файлу func.txt.

$ sed -n '1,$1' func.txt

This is the Fl key:\033OP$ This is the F2 key:\033OQ$

Теперь ситуация немного проясняется. По таблице ASCII–кодов можно узнать, что восьмеричный код 033 соответствует непечатаемому символу esc. Именно он в выводе команды cat -v обозначается как ^ [. За ним идут два обычных символа: сначала 'О', затем 'Р' либо 'Q'. Таким образом, мы имеем дело с двумя клавишами, каждая из которых сгенерировала трехсимвольную последовательность: одна — esc‑O–р, а вторая — esc‑o–q. Когда файл отображается в обычном режиме, каждому символу соответствует одно знакоместо, поэтому первые два символа последовательности отбрасываются и остается последний: 'P' и 'Q' соответственно.

Нет системной команды, которая позволяла бы узнать, какие клавиши генерируют эти коды. Подобные сведения находятся в базах данных termcap и terminfo, хранящих установки терминала, но знакомство с этими базами данных выходит за рамки нашей книги. Проще всего пойти экспериментальным путем: ввести команду cat или cat -v без указания входного файла, с тем чтобы попробовать самостоятельно определить, нажатия каких клавиш приводят к отображению на экране нужных последовательностей символов. В нашем случае последовательность ESC‑O–P генерируется клавишей [F1], а последовательность ESC‑O–Q — клавишей [F2], хотя в общем это зависит от установок терминала.