355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Дэвид Тейнсли » Linux и UNIX: программирование в shell. Руководство разработчика » Текст книги (страница 8)
Linux и UNIX: программирование в shell. Руководство разработчика
  • Текст добавлен: 15 октября 2016, 00:39

Текст книги "Linux и UNIX: программирование в shell. Руководство разработчика"


Автор книги: Дэвид Тейнсли



сообщить о нарушении

Текущая страница: 8 (всего у книги 25 страниц)

Если команды sed помещены в отдельный файл, командная строка примет следующий вид:

sed [опции] – f файл_сценария входной_файл

Если файл сценария является исполняемым, запустить его на выполнение следует таким образом:

файл_сценария [опции] входной_файл

Когда входной файл не указан, sed будет ожидать поступления данных из стандартного входного потока: с клавиатуры или из канала.

Ниже перечислены основные опции редактора sed и описано их назначение:

–n Запрет вывода на экран. При наличии этой опции редактор sed не будет записывать обрабатываемые им строки в стандартный выходной поток, тогда как по умолчанию отображается каждая входная строка. Осуществить вывод нужной строки можно будет только с помощью команды p (рассматривается ниже).

–e Следующей командой будет команда редактирования. Эта опция используется в том случае, когда команд редактирования несколько. Если же имеется только одна такая команда, то указывать данную опцию не нужно, хотя ее наличие и не является ошибкой.

–f Эта опция используется при подключении файла сценария.

10.2.1. Сохранение выходных данных

Если требуется сохранить проделанные изменения, просто перенаправьте результаты работы редактора sed в файл, как показано ниже:

$ sed 'команды' входной_файл > выходной_файл

10.2.2. Синтаксис команд

Общий синтаксис команд редактора sed таков:

[адрес1 [, адрес2] ] [ ! ] команда [аргументы]

Команда состоит из одной буквы или одного символа (Список основных команд представлен ниже). Аргументы требуются лишь нескольким командам, в частности, команде s. Элементы, представленные в квадратных скобках, являются необязательными, а сами скобки набирать не нужно.

Просмотр входного файла по умолчанию начинается с первой строки. Существует два способа адресации строк:

   1. По номерам.

   2. С помощью регулярных выражений (о них рассказывалось в главе 7).

В команде может быть указано два адреса, один адрес или ни одного адреса. В следующей таблице описаны все возможные правила отбора строк в зависимости от того, сколько компонентов адреса задано (табл. 10.1).

Таблица 10.1. Правила отбора строк в редакторе sed

Адрес

Отбираемые строки

нет адреса

Все строки входного файла

X

Строка с номером x

х, у

Все строки с номерами в диапазоне от x до y

/шаблон/

Все строки, соответствующие шаблону

/шаблон1/, /шаблон 2/

Группа строк, начиная от строки, соответствующей первому шаблону, и заканчивая строкой, которая соответствует второму шаблону; подобных групп во входном файле может быть несколько

/шаблон/,х

Группа строк, начиная от строки, соответствующей шаблону, и заканчивая строкой с указанным номером

x,/шаблон/

Группа строк, начиная от строки с указанным номером и заканчивая строкой, соответствующей шаблону

!

Все строки, не соответствующие заданному адресу

$

Последняя строка входного файла

Некоторые команды, в частности, a, i, r, q и =, требуют указания только одного адреса.

10.2.3. Основные команды редактирования

Ниже представлен список основных команд, имеющихся в редакторе sed (табл. 10.2).

Таблица 10.2. Основные команды sed

p

Вывод адресуемых строк

ж

Вывод номеров адресуемых строк

а

Добавление заданного текста после каждой адресуемой строки

i

Вставка заданного текста перед каждой' адресуемой строкой

с

Замена адресуемого текстового блока заданным текстом

d

Удаление адресуемых строк

s

Замена указанного шаблона заданным текстом в каждой адресуемой строке

w

Добавление адресуемых строк в указанный файл

r

Чтение текста из указанного файла и добавление его после каждой адресуемой строки

q

Завершение работы после того, как достигнута адресуемая строка

l

Вывод адресуемых строк с отображением непечатаемых символов в виде ASCII-

кодов и переносом длинных строк

С помощью фигурных скобок можно объединить несколько команд в группу. Возможны два синтаксиса группировки:

[адрес1[, адрес2]]{ команда 1

командаN

}

или

[адрес1[,адрес2]] {команда1; …командаN; }

В первом случае каждая команда записывается в отдельной строке, а разделителем команд является символ новой строки. Во втором случае команды записываются последовательно, отделяясь друг от друга точкой с запятой, которая ставится также после завершающей команды.

Ниже приведен текстовый файл quote.txt, который используется во многих примерах данной главы:

$ cat 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.

10.3. Регулярные выражения

Редактор sed распознает базовые регулярные выражения, которые мы уже рассматривали в главе 7. Дополнительные особенности появляются только в шаблонах поиска и замены в команде s. С помощью операторов ( и ) можно сохранить до девяти шаблонов поиска во временном буфере, с тем чтобы в шаблоне замены обратиться к ним с помощью оператора n, где п – номер сохраненного шаблона. Метасимвол & позволяет в шаблоне замены сослаться на фрагмент строки, соответствующий шаблону поиска.

10.4. Вывод строк (команда p)

Рассмотрим, как в редакторе sed осуществляется поиск строк и вывод их на экран.

10.4.1. Отображение строки по номеру

Команда p (print) имеет такой формат:

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

Для отображения строки входного файла достаточно указать ее номер, например:

$ sed '2р' quote.txt

The honeysuckle band played all night long for only $90.

It was an evening of splendid music and company.

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.

Что было сделано неправильно? Ведь требовалось отобразить только строку номер 2, однако в результате были выведены на экран все строки файла, причем вторая строка – дважды. Причина подобного поведения заключается в том, что по умолчанию редактор sed отображает каждую просматриваемую строку. Чтобы избежать этого, воспользуемся опцией -n:

$ sed -n '2р' quote.txt

It was an evening of splendid music and company.

10.4.2. Отображение строк из заданного диапазона

Предположим, требуется вывести строки с номерами от 1 до 3. В этом случае следует указать два адреса, разделенные запятой:

$ sed -n '1,3p' 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.4.3. Поиск строк, соответствующих шаблону

В следующем примере показано, как найти строку, содержащую слово "Neave":

$ sed -n '/Neave/p' quote.txt

The local nurse Miss P. Neave was in attendance.

10.4.4. Поиск пo шаблону и номеру строки

Если адрес представлен в виде шаблона, редактор sed находит все строки, соответствующие этому шаблону. Как можно уточнить местонахождение строки? Рассмотрим пример. Предположим, требуется найти слово "The" в последней строке файла quote.txt. Если воспользоваться поиском по шаблону, то будет получено две строки:

$ sed -n '/The/p' quote.txt

The honeysuckle band played‑all night long for only $90.

The local nurse Miss P. Neave was in attendance.

Чтобы остановить свой выбор на последней строке, следует указать ее номер перед шаблоном:

$ sed -n '4,/The/p' quote.txt

The local nurse Miss P. Neave was in attendance.

10.4.5. Поиск специальных символов

Если требуется найти строку, содержащую символ '$', который в редакторе sed имеет специальное назначение, следует защитить этот символ от интерпретации с помощью обратной косой черты, как показано ниже:

$ sed -n /$/р' quote.txt

The honeysuckle band played all night long for only $90.

10.4.6. Поиск первой строки

Для вывода первой строки входного файла достаточно указать ее номер:

$ sed -n '1р' quote.txt

The honeysuckle band played all night long for only $90.

10.4.7. Поиск последней строки

Чтобы сослаться на последнюю строку входного файла, воспользуйтесь метасимволом '$':

$ sed -n '$p' quote.txt

The local nurse Miss P. Neave was in attendance.

10.4.8. Отображение всего файла

Если требуется отобразить весь файл, задайте диапазон строк от первой до последней:

$ sed -n '1,$p' 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.

10.5. Вывод номеров строк (команда =)

Команда = имеет следующий формат:

[адрес]=

Она предназначена для вывода номера строки, соответствующей заданному адресу. Рассмотрим пример:

$ sed '/music/=' quote.txt

The honeysuckle band played all night long for only $90.

2

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.

В данном случае отображается весь файл, причем перед строкой, содержащей слово "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":

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

Аналогичным образом будет вести себя и редактор 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:33OP$ This is the F2 key:33OQ$

Теперь ситуация немного проясняется. По таблице 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. Обработка управляющих символов

Одной из задач, для которых редактор sed используется весьма часто, является удаление управляющих, непечатаемых и просто посторонних символов из файлов, которые были загружены из других систем. Ниже приведен фрагмент подобного файла dos.txt.

$ cat -v dos.txt

12332##DISO##45.12^M C0332##LPSO##23.11^M

01299##USPD##34.46^M

Вот что необходимо сделать:

   1. Заменить все знаки решетки ('#'( пробелом.

   2. Удалить из первого поля каждой строки все ведущие нули.

   3. Удалить в конце каждой строки последовательность ^M, генерируемую непечатаемым символом CR – возврат каретки (ASCII–код 13).

Примечание:

В ряде систем, в которых мне приходилось выполнять подобные преобразования, в конце строки стоит символ перевода строки LF (ASCII–код 10, отображается как ^@). Подобная проблема нередко возникает при передаче файлов между двумя системами, в одной из которых символ новой строки (n) заменяется последовательностью CR/LF, a в другой – только одним из этих двух управляющих символов.

Задача 1. Удаление всех символов решетки реализуется без особого труда. Для этого достаточно выполнить команду замены s с флагом глобальной подстановки д, указав при этом, что один или более символов '#', идущих подряд, должны быть заменены пробелом:

$ sed 's/##*/ /g' dos.txt | cat -v

12332 DISO 45.12^М

00332 LPSO 23.11^М

01299 USPD 34.4б^M

Задача 2. Для удаления всех ведущих нулей следует в команде s оставить шаблону замены пустым, а шаблон поиска задать таким: /^0*/. Он означает, что требуется найти любое количество нулей, стоящих в начале строки.

$ sed 's/^0*//' dos.txt | cat -v

12332##DISO##45.12^M

332##LPSO##23.11^M

1299##USPD ##34.46^M

Задана 3. Чтобы избавиться от управляющих символов ^M в конце строк, необходимо. также применить команду s, оставив шаблон замены пустым. А вот при формировании шаблона поиска следует учесть, что мы имеем дело с непечатаемым символом. Нельзя просто ввести символы '^' и 'M', так как полученный шаблон будет означать, что мы ищем букву 'М', стоящую в начале строки. Чтобы действительно создать нужный нам непечатаемый символ, необходимо нажать [Ctrl+V], а затем – клавишу [Enter]. Результат будет выглядеть как регулярное выражение ^M, но на самом деле это экранное представление символа CR.

$ sed 's/^M//' dos.txt | cat -v

12332##DIS0##45.12 0D332##LPSO##23.11 01299##U5PD#t34.46

Теперь можно попробовать объединить три команды в одну с помощью опции -e;

$ sed -e 's/^0*//' -e 's/^M//' -e 's/##*/ /g' dos.txt | cat -v

12332 DISO 45.12

332 LPSO 23.11

1299 USPD 34.46

Выходные данные редактора sed передаются по каналу команде cat -v, которая позволяет убедиться, что вся работа, включая удаление непечатаемых символов, выполнена правильно.

Приведенные выше команды удобнее поместить в файл сценария. Назовем его dos.sed. Вот его текст:

$ cat dos.sed

#! /bin/sed -f

#Имя: dos.sed

#Командная строка: dos.sed dos.txt

#Избавляемся от символа решетки

s/##*/ /g

#Удаляем ведущие нули

s/^0*//

#Удаляем символы возврата каретки

s/^M//

На входе данного сценария следует указать файл dos.txt. Сценарий "исправит" этот файл и выведет результат на экран. Если же ввести следующую командную строку:

$ dos.sed dos.txt | tee dos.txt

то результат будет записан обратно в файл dos.txt.

10.16.2. Обработка отчетов

Я часто сталкиваюсь с необходимостью форматировать данные, возвращаемые инструкциями SQL. Для этого приходится писать комплексные сценарии, в которых сразу несколько текстовых фильтров выполняют работу совместно. Рассмотрим результаты выполнения некоторой инструкции SQL, выполняющей обращение к одной из таблиц базы данных:


Database

Size (MB)

Date created

GOSOUTH

2244 5632

12/11/9? 8/9/99

TRISUD

(2 rows affected) Из этой информации нас, предположим, интересуют только имена баз данных, находящиеся в первой колонке. Чтобы их извлечь, необходимо выполнить следующую последовательность действий:

   1. Удалить пунктирную линию с помощью команды s/–*//g.

   2. Удалить все пустые строки с помощью команды /^$/d.

   3. Удалить последнюю строку с помощью команды $d.

   4. Удалить первую строку с помощью команды 1d.

   5. Отобразить первый столбец с помощью команды awk '{print $1}'. Ниже приведена соответствующая цепочка команд:

$ sed 's/–*//g' -e '/^$/d' -e '$d' -e '1d' sql.txt | awk '{print $1}'

GOSOUTH TRISUD

10.16.3. Добавление текста

В процессе потоковой обработки файла мне иногда требуется добавить к каждой проверенной строке какой‑нибудь текст, сообщающий о том, как прошла обработка. Предположим, имеется такой файл:

$ cat ok.txt

АС456

АС492169

АС9967

АС88345

Наша задача состоит в добавлении слова "Passed" (обработано) в конец каждой строки. Решить ее несложно. Достаточно в шаблоне поиска указать метасимвол '$', означающий конец строки, а в шаблоне замены – пробел и искомое слово:

$ sed 's/$/ Passed/' ok.txt


    Ваша оценка произведения:

Популярные книги за неделю