sed — один из самых мощных и популярных инструментов в Linux/Unix-системах для работы с текстом. Название утилиты расшифровывается как Stream EDitor (потоковый редактор), что отражает принцип ее работы: она читает текст построчно (из файла или конвейера), применяет заданные команды и выводит результат. sed идеально подходит для автоматизации и используется для редактирования конфигурационных файлов, при работе с лог-файлами, скриптами и любыми текстовыми данными.
Сегодня мы подробно рассмотрим синтаксис и особенности утилиты sed и применим ее на практике.
Облачные серверы
по всему миру с почасовой оплатой.
Принцип работы sed
-
Читает одну строку из входного потока данных и передает ее в свой буфер шаблонов. Под потоком данных понимают файл или стандартный ввод (
stdin). -
Последовательно применяет к строке указанные команды.
-
Выводит содержимое буфера шаблонов.
-
Переходит к следующей строке.
При этом по умолчанию sed не меняет содержимое исходного файла. Чтобы вносить изменения в исходный файл, необходимо явно указать опцию.
Синтаксис sed
Синтаксис утилиты sed следующий:
Рассмотрим на простом примере. Предположим, у нас есть файл new-file.txt, в котором указано три строки со словом «привет»:

Необходимо заменить все слова «привет» на «мир» и вывести результат на экран без изменения исходного файла. Для этого используем команду:

Расшифровка опций:
-
s— команда для замены. -
's/привет/мир/g'— строка с командой, которая производит замену. Состоит из нескольких частей: -
s— команда для замены. -
/— разделитель. Можно использовать любой другой символ. -
привет— можно использовать как регулярные выражения, так и слова. Здесь мы указываем слово, которое хотим заменить. -
мир— строка замены. Здесь мы обозначаем, на что меняем. -
g— отвечает за глобальную замену: заменяются все вхождения шаблона в каждой строке. -
new-file.txt— имя обрабатываемого файла.
Опции
В таблице ниже приведены часто используемые команды утилиты sed. Более подробную информацию можно найти в официальной документации.
|
Опция |
Что делает |
Пример команды |
|
|
Заменяет значение |
|
|
|
Заменяет значения в исходном файле |
|
|
|
Удаляет строку |
|
|
|
Выводит строки |
|
|
|
Добавляет текст после строки |
|
|
|
Заменяет всю строку |
|
|
|
Заменяет символы |
|
|
|
Выводит номер строки |
|
|
|
Выходит после выполнения команды |
|
|
|
Записывает строки в файл |
|
Практическое применение sed
Для наглядности рассмотрим практические примеры использования утилиты sed. Устанавливать утилиту не надо — она уже автоматически предустановлена практически во всех современных дистрибутивах Linux\Unix.
Простая замена текста
Заменить все слова user на dev-user в файле main.txt:

Следующий пример аналогичен команде выше, но результат будет сохранен в новый файл с именем new-main.txt:

Заменить все слова "user" на "dev-user" в файле main.txt. При этом исходный файл main.txt будет перезаписан:

Заменить слово “user” на “dev-user” только во второй строке:

Заменить все слова «http» во всех строках на «https» и перезаписать изменения в исходном файле urls.txt:

Замена символов
Заменить все запятые на точки с запятой в файле data.csv:

Удаление строк и символов
Удалить все строки, которые начинаются с символа комментария #:

Удалить все пустые строки:

Удалить строки с пятой по десятую:

Удаление HTML-тегов
Предположим, у нас есть файл с HTML-страницей. Нам необходимо удалить все теги (символы <>):

Очистка лог-файла от IP-адресов
Представим ситуацию: вы работаете с лог-файлом доступа Nginx (access.log). В файл записываются IP-адреса источников, однако один и тот же IP-адрес может обращаться к нескольким ресурсам одновременно. Вам нужно подготовить отчет, предварительно удалив из файла все IP-адреса, а также символы - -, которые перечислены после каждого IP-адреса. Изменения необходимо записать в новый файл access_modified.log. Для этого используем команду:

Массовое редактирование конфигурационных файлов
Вы — системный администратор в компании-интеграторе и отвечаете за миграцию инфраструктуры. После переезда в нескольких десятках конфигурационных файлов с расширением .conf поменялся IP-адрес базы данных. Старый IP-адрес — 192.168.1.100 — необходимо заменить на новый 10.0.1.50. Воспользуемся следующей командой sed для решения задачи:

Обратите внимание, что мы экранировали символ точки (\.), так как в регулярных выражениях точка означает «любой символ».
Извлечение IP-адресов из лог-файлов
Вы администрируете веб-сервер Nginx. Служба безопасности просит вас прислать список IP-адресов пользователей, которые посещают ресурсы веб-сайта компании, для дальнейшего анализа. При помощи утилиты sed извлечем только уникальные IP-адреса и отсортируем их:

Подготовили для вас выгодные тарифы на облачные серверы
477 ₽/мес
657 ₽/мес
Заключение
Утилита sed — один из самых мощных инструментов в арсенале любого системного администратора, DevOps-инженера или просто продвинутого пользователя Linux/Unix-систем. Ее сила заключается в удивительной простоте синтаксиса при практически неограниченных возможностях, которые открываются при грамотном использовании регулярных выражений и комбинировании с другими утилитами командной строки.
Мы убедились, что sed способна решать задачи любого уровня сложности — от простой замены одного слова на другое до массового редактирования десятков и сотен конфигурационных файлов, очистки и трансформации логов, удаления HTML-тегов, извлечения нужных данных по сложным шаблонам и даже транслитерации символов. При этом процесс редактирования текста происходит мгновенно.
sed обладает ключевыми преимуществами:
-
Потоковая обработка — минимальное потребление памяти даже при работе с большими файлами.
-
Не меняет исходные файлы по умолчанию, что обеспечивает безопасность и сохраняемость исходных файлов.
-
Поддержка расширенных регулярных выражений (
-E / -r) и мощных адресов (номера строк, шаблоны, диапазоны). -
Простота автоматизации —
sedлегко встраивается в bash-скрипты и cron-файлы.
