2. Tutorial SED

SED представлен потоковым текстовым редактором. В интерактивных текстовых редакторах, наподобие nano, с текстами работают, используя клавиатуру, редактируя файлы, добавляя, удаляя или изменяя тексты. Седло позволяет редактировать потоки данных, настройку заданных разработчиком набора правил. Вот как выглядит схема вызова этой команды:

$ sed options file

По умолчанию sed применяет функцию при вызове правила, выраженные в виде набора команд, к  STDIN. Это позволяет данные непосредственно sed. 
 
Например, так:
$ echo "This is a test" | sed 's/test/another test/'

Вот что получится при выполнении этой команды.


Простой пример вызова sed
В данном случае sed заменяет слово «test» в строке, переданной для обработки, словами «другой тест». Для оформления правил обработки текста, заключённого в кавычки, используются прямые слэши. В нашем случае применена команда видаs/pattern1/pattern2/. Буква «s» - это сокращение слова «заменитель», то есть - перед нами команда замены. Sed, выполняя эту команду, просмотренный переданный текст и заменит найденные в нём фрагменты (о том - какие именно, поговорим ниже), соответствующие pattern1, на pattern2.

Выше приведён примитивный пример использования sed, нужный вам пример в курс дела. На самом деле, sed можно применить в гораздо более сложных сценариях обработки текстов, например - для работы с силами.

Ниже показан файл, в котором содержится фрагмент текста, и его обработка такой командой:

$ sed 's/t

Текстовый файл и результаты его обработки

Здесь применён тот же подход, который мы использовали выше, но sed теперь обрабатывает текст, хранящийся в файле. При этом обрабатываются, обрабатываются данные, порциями и выводится то, что обработано, на экран, не дожидаясь обработки всего файла.

Sed не меняет данные в обрабатываемом файле. Редактор читает файл, обрабатывает прочитанное, и отправляет то, что получилось, в STDOUT. Для того, чтобы убедиться в том, что исходный файл не изменился, достаточно, после того, как он был передан sed, открыть его. При необходимости вывода sed можно перенаправить в файл, возможно - перезаписать старый файл. Если вы знакомы с одним из предыдущих  материалов Вывод этой серии может быть выполнен.

Выполнение наборов команд при вызове sed


Для выполнения нескольких действий с данными, используйте ключ  -e при вызове sed. Например, вот как организовать замену двух фрагментов текста:

$ sed -e 's/This/That/; s/test/another test/' ./myfile


Использование ключа -e при вызове sed

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

$ sed -e '
> s/This/That/
> s/test/another test/' ./myfile

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


Другой способ работы с sed

Чтение команд из файла


Если имеется набор команд sed, обычно удобнее всего записать их в файл. Для того, чтобы указать файл, выполните команду, используйте ключ  -f:

Вот содержимое файла  mycommands:

s/This/That/
s/test/another test/

Вызовем sed, передается файл с командой и файл для обработки:

$ sed -f mycommands myfile

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


Использование файла с командами при вызове sed

Флаги команды замены


Внимательно посмотрите на следующий пример.

$ sed 's/test/another test/' myfile

Вот что содержится в файле, и что будет получено после его обработки sed.


Исходный файл и результаты его обработки

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

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

s/pattern/replacement/flags

Выполнение этой команды можно модифицировать использование средств.

  • При передаче номера учитывается порядковый номер вхождения кода в строке, заменено будет именно это вхождение.
  • Флаг  g указывает на то, что нужно обработать все вхождения в шаблоне формы в строке.
  • Флаг  p указывает на то, что нужно вывести содержимое исходной строки.
  • Флаг вида  w file указывает на команду то, что нужно записать результаты обработки текста в файл.

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

$ sed 's/test/another test/2' myfile


Вызов команды замены с указанием позиции заменя фрагмента.

Мы указали, в качестве флага замены, число 2. Это было заменено вторым вхождение искомого шаблона в каждой строке. Теперь опробуем флаг глобальной замены - g:

$ sed 's/test/another test/g' myfile

Как видно из результатов вывода, такая команда заменила все вхождения шаблона в тексте.


Глобальная замена

команды замены p позволяет выводить строки, в которых найдены совпадения, при этом ключ -n, при вызове sed, подавляет обычный вывод:

$ sed -n 's/test/another test/p' myfile

Как результат, при запуске sed в такой конфигурации на экран выводятся лишь строки (в случае - одна строка), в котором найден заданный фрагмент текста.


Использование флага команды замены p

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

$ sed 's/test/another test/w output' myfile


Сохранение результатов обработки текста в файле

Хорошо видно, что в ходе работы команды данные выводятся в  STDOUT , при этом обработанные строки записываются в файл, имя которого указано после w.

Символы-разделители


Представьте, что нужно заменить  /bin/bash на  /bin/csh в файле  /etc/passwd. Задача не такая уж и сложная:

$ sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd

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

К счастью, sed позволяет нам самостоятельно задавать символы-разделители для использования их в команде замены. Разделителем считается первый символ, который будет встречен после  s:

$ sed 's!/bin/bash!/bin/csh!' /etc/passwd

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

Выбор фрагментов текста для обработки


До сих пор мы вызывали sed для обработки всего переданного редактора потока данных. В некоторых случаях с помощью sed надо обработать лишь какую-то часть текста - некую конкретную строку или группу строк. Для достижения такой цели можно использовать двумя подходами:

  • Задать ограничение на номера обрабатываемых строк.
  • Указать фильтр, соответствующие строки нужно обработать.

Рассмотрим первый подход. Тут допустимо два варианта. Первый, рассмотренный ниже, предусматривает указание номера одной строки, которую нужно обработать:

$ sed '2s/test/another test/' myfile


Обработка только одной строки, номер который задан при вызове sed
 
Второй вариант - диапазон строк:

$ sed '2,3s/test/another test/' myfile


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

$ sed '2,$s/test/another test/' myfile


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

$ sed '/likegeeks/s/bash/csh/' /etc/passwd

Источник: 
  • sed
  • 0 کاربر این را مفید یافتند
آیا این پاسخ به شما کمک کرد؟

مقالات مربوطه

1. AWK tutorial for Site

  Источник:  Анализ файлов журнала Apache В файлах журнала (логах) сервера записаны все...

4. Полезные советы для системного администрирования Linux SED

SED полезные советы для системного администрирования Linux SED В этой статье мы рассмотрим...

3. Analiz logov серверного ПО

♒ Скрипты для анализа логов веб сервера Что такое, как расшифровывается, что хранится в логах...

0. CLI

Примеры команд для удобной работы на сервере: #Тихая заходка на хост://Отключение записи истории...