Библиотека сайта rus-linux.net
Руководство по 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 можно найти в скриптах запуска вашей машины,
которые обычно находятся в директории grep sed * |
Предыдущий раздел: | Оглавление | Следующий раздел: |
Введение | Неинтерактивное редактирование |