Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по Bash для начинающих
Назад Глава 5: Потоковый редактор GNU sed Вперед

Интерактивное редактирование

Выдача строк, содержащих шаблон

Подобное, конечно, вы можете сделать с помощью команды grep, но с ее помощью вы не сможете выполнить действие "Найти и заменить". С этого вы только начнете.

Ниже приведен наш текстовый файл example:

sandy ~> cat -n example
     1  This is the first line of an example text.
     2  It is a text with erors.
     3  Lots of erors.
     4  So much erors, all these erors are making me sick.
     5  This is a line not containing any errors.
     6  This is the last line.

sandy ~>

Мы хотим с помощью редактора sed найти все строки, содержащие наш шаблон поиска, в данном случае "erors". Чтобы найти результат, мы используем p:

sandy ~> sed  '/erors/p' example
This is the first line of an example text.
It is a text with erors.
It is a text with erors.
Lots of erors.
Lots of erors.
So much erors, all these erors are making me sick.
So much erors, all these erors are making me sick.
This is a line not containing any errors.
This is the last line.

sandy ~>

Как вы заметили, sed выдает весь файл, а строки, содержащие искомую строку, выводятся дважды. Это не то, что нам нужно. Чтобы выводить только те строки, которые соответствуют нашему шаблону, используйте параметр -n:

sandy ~> sed -n '/erors/p' example
It is a text with erors.
Lots of erors.
So much erors, all these erors are making me sick.

sandy ~>

Удаление строк ввода, содержащих шаблон

Мы используем тот же самый текстовый файл example. Теперь мы хотим видеть лишь строки, в которых нет искомой строки:

sandy ~> sed '/erors/d' example
This is the first line of an example text.
This is a line not containing any errors.
This is the last line.

sandy ~>

Команда d указывает, что найденные строки не показываются.

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

sandy ~> sed -n '/^This.*errors.$/p' example
This is a line not containing any errors.

sandy ~>

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

Диапазоны строк

На этот раз мы хотим получить строки, в которых есть ошибки. В примере такими являются строки с 2 по 4. Укажите этот диапазон адресов и команду d:

sandy ~> sed '2,4d' example
This is the first line of an example text.
This is a line not containing any errors.
This is the last line.

sandy ~>

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

sandy ~> sed '3,$d' example
This is the first line of an example text.
It is a text with erors.

sandy ~>

В итоге будут выведены только первые две строки файла example.

Следующая команда выдает строки, начиная с первой, в которой обнаружен шаблон "a text", и до той строки, в которой обнаружен шаблон "a line":

sandy ~> sed -n '/a text/,/This/p' example
It is a text with erors.
Lots of erors.
So much erors, all these erors are making me sick.
This is a line not containing any errors.

sandy ~>

Поиск и замена с помощью sed

Теперь мы будем в файле example искать ошибки и заменять их, а не только искать строки, содержащие (или не содержащие) искомую строку.

sandy ~> sed 's/erors/errors/' example
This is the first line of an example text.
It is a text with errors.
Lots of errors.
So much errors, all these erors are making me sick.
This is a line not containing any errors.
This is the last line.

sandy ~>

Как вы видите, это не совсем то, что нам нужно: в строке 4 замена была выполнена только для первого вхождения, и там еще осталась строка 'eror'. Используйте g команду, чтобы указать sed, что он должен проверять всю строку, а не останавливаться после того, как обнаружит первое вхождение вашей строки:

sandy ~> sed 's/erors/errors/g' example
This is the first line of an example text.
It is a text with errors.
Lots of errors.
So much errors, all these errors are making me sick.
This is a line not containing any errors.
This is the last line.

sandy ~>

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

sandy ~> sed 's/^/> /' example
> This is the first line of an example text.
> It is a text with erors.
> Lots of erors.
> So much erors, all these erors are making me sick.
> This is a line not containing any errors.
> This is the last line.

sandy ~>

Вставка некоторой строки в конце каждой строки:

sandy ~> sed 's/$/EOL/' example
This is the first line of an example text.EOL
It is a text with erors.EOL
Lots of erors.EOL
So much erors, all these erors are making me sick.EOL
This is a line not containing any errors.EOL
This is the last line.EOL

sandy ~>

Можно задать сразу несколько команд поиска и замены, предваряя каждую параметром -e:

sandy ~> sed -e 's/erors/errors/g' -e 's/last/final/g' example
This is the first line of an example text.
It is a text with errors.
Lots of errors.
So much errors, all these errors are making me sick.
This is a line not containing any errors.
This is the final line.

sandy ~>

Имейте в виду, что по умолчанию sed выдает свои результаты в стандартный выходной поток, то есть, как правило, в ваше терминальное окно. Если вы хотите сохранить результат в файле, то выполните перенаправление:

sed option 'some/expression' file_to_process > sed_output_in_a_file 
 Дополнительные примеры

Довольно много примеров использования команды sed можно найти в скриптах запуска вашей машины, которые обычно находятся в директории /etc/init.d или /etc/rc.d/init.d. Перейдите в директорий, в котором в вашей системе находятся скрипты ini, и выполните следующую команду:

grep sed * 

Предыдущий раздел: Оглавление Следующий раздел:
Введение   Неинтерактивное редактирование