Шрифт:
Иногда требуется завершить работу редактора 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], хотя в общем это зависит от установок терминала.
Если вам интересно, как можно создать файл func.txt, ниже описана возможная процедура:
1. Загрузите редактор vi.
2. Перейдите в режим вставки с помощью команды i и введите первую строку файла вплоть до двоеточия.
3. Нажмите [Ctrl+V], при этом появится символ '^'
4. Нажмите клавишу [F1], при этом отобразится последовательность [ор.
5. Нажмите клавишу [Enter] и повторите пункты 2—4 для второй строки файла (в конце нажимается клавиша [F2]).
6. Нажмите клавишу [Esc], чтобы выйти из режима вставки.
7. Введите команду w func.txt, чтобы сохранить файл.
8. Введите команду q, чтобы выйти из редактора vi.
10.16. Дополнительные примеры использования редактора sed
Выше были описаны основные команды sed. Далее мы рассмотрим ряд практических примеров применения редактора sed.
10.16.1. Обработка управляющих символов