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

Необходимо заменить все слова «привет» на «мир» и вывести результат на экран без изменения исходного файла. Для этого используем команду:
sed 's/привет/мир/g' new-file.txt

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

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

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

Заменить слово “user” на “dev-user” только во второй строке:
sed 's/user/dev-user/2' main.txt

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

Замена символов
Заменить все запятые на точки с запятой в файле data.csv:
sed -i 's/,/;/g' data.csv

Удаление строк и символов
Удалить все строки, которые начинаются с символа комментария #:
sed '/^#/d' config.conf

Удалить все пустые строки:
sed '/^$/d' file.txt

Удалить строки с пятой по десятую:
sed '5,10d' file.txt

Удаление HTML-тегов
Предположим, у нас есть файл с HTML-страницей. Нам необходимо удалить все теги (символы <>):
sed 's/<[^>]*>//g' index.html

Очистка лог-файла от IP-адресов
Представим ситуацию: вы работаете с лог-файлом доступа Nginx (access.log). В файл записываются IP-адреса источников, однако один и тот же IP-адрес может обращаться к нескольким ресурсам одновременно. Вам нужно подготовить отчет, предварительно удалив из файла все IP-адреса, а также символы - -, которые перечислены после каждого IP-адреса. Изменения необходимо записать в новый файл access_modified.log. Для этого используем команду:
sed -E 's/([0-9]{1,3}\.){3}[0-9]{1,3} - - //g' access.log > access_modified.log

Массовое редактирование конфигурационных файлов
Вы — системный администратор в компании-интеграторе и отвечаете за миграцию инфраструктуры. После переезда в нескольких десятках конфигурационных файлов с расширением .conf поменялся IP-адрес базы данных. Старый IP-адрес — 192.168.1.100 — необходимо заменить на новый 10.0.1.50. Воспользуемся следующей командой sed для решения задачи:
find . -name "*.conf" -exec sed -i 's/192\.168\.1\.100/10.0.1.50/g' {} \;

Обратите внимание, что мы экранировали символ точки (\.), так как в регулярных выражениях точка означает «любой символ».
Извлечение IP-адресов из лог-файлов
Вы администрируете веб-сервер Nginx. Служба безопасности просит вас прислать список IP-адресов пользователей, которые посещают ресурсы веб-сайта компании, для дальнейшего анализа. При помощи утилиты sed извлечем только уникальные IP-адреса и отсортируем их:
sed -E 's/^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*/\1/' access.log | sort -u > ip_addresses.txt

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