Знакомство с потоковым редактором sed

Поиск по тексту нередко предполагает последующую замену текста или какое-либо другое редактирование. В этом смысле sed – своего рода логическое продолжение grep'а.

Sed – это потоковый текстовый редактор. Потоковый, потому что не загружает весь текст в память, как обычный редактор, а читает его построчно, в потоке. При этом применяет к каждой строке набор команд, описанных программистом заранее. Отсюда следует, что sed имеет свой, хоть и небольшой, язык программирования. Пример:

Замена текста с помощью команды sed

С помощью команды cat был создан файл text.txt. Потом с помощью sed мы заменили слово 'one' на 'ONE'. Результат обработки был выведен на экран. Сам файл остался без изменений.

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

Перенаправление в файл с потоковым редактором sed

Также можно использовать ключ -i:

Ключ -i с суффиксом (создание нового файла)

Суффикс после -i будет добавлен к новому файлу. Если же использовать -i без суффикса, то произойдет перезапись существующего файла:

Ключ -i без суффикса (перезапись существующего файла)

Выражение 's/one/ONE/' – это одна команда. Символ s в начале указывает, что надо найти строку, стоящую после первого слэша, и заменить ее строкой, стоящей после второго. Поскольку sed'у можно передавать несколько команд, то их разделяют точкой с запятой. Также в этом случае потребуется ключ -e.

Ключ -e (передача нескольких команд)

С другой стороны можно заранее подготовить файл с командами, разделяя команды переходом на новую строку. При использовании файла указывается ключ -f.

Ключ -f (передача файла с командами)

Команда вида 's/one/two/' заменяет в каждой строке только первое вхождение 'one'. Однако в строке таких подстрок может быть несколько. Чтобы заменить все вхождения, после последнего слэша в команде пишется флаг g.

Флаг g (замена всех вхождений подстроки в строку)

Если надо заменить подстроку, в которой используется символ слэша, его экранируют обратным слэшем. Другой способ – использовать в качестве разделителя частей команды не слэш. Sed считает разделителем любой символ перед искомой строкой.

Символ-разделитель в потоковом редакторе sed

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

Как и в случае с grep в качестве подстрок часто используют регулярные выражения:

Пример использования регулярного выражения

В примере регулярное выражение '^\s*$' ищет пустые строки, а инструкция d удаляет их.