Работа с конфигурационными файлами, логами и скриптами — ежедневная рутина любого администратора. Открывать каждый файл в редакторе, искать нужную строку и вручную её менять? Долго и неэффективно. Именно для таких задач существует sed — stream editor, который позволяет редактировать текст прямо из командной строки.
Что такое sed и зачем он нужен
sed — это утилита для потокового редактирования текста в Unix-подобных системах. Она работает как конвейер: принимает текст на вход, обрабатывает его по заданным правилам и выводит результат.
Типичные задачи, которые решает sed:
- Массовая замена текста в файлах
- Удаление или добавление строк по условию
- Извлечение нужных фрагментов из логов
- Автоматизация правок в конфигах
- Обработка данных в скриптах
Главное преимущество — скорость и возможность обработать сразу несколько файлов одной командой.
Базовый синтаксис
sed [опции] 'команда' файл
Самая частая опция — -i (in-place), которая сохраняет изменения прямо в исходном файле. Без неё sed просто выводит результат в консоль, не меняя оригинал.
Замена текста — основная функция sed
Простая замена
Базовая конструкция выглядит так:
sed 's/old_text/new_text/' file.txt
Пример: заменить первое вхождение слова "error" на "warning" в каждой строке:
sed 's/error/warning/' server.log
⚠️ Важно: по умолчанию sed заменяет только первое совпадение в строке.
Замена всех вхождений в строке
Добавьте флаг g (global) в конце команды:
sed 's/error/warning/g' server.log
Теперь заменятся все слова "error" в каждой строке, а не только первое.
Замена с сохранением в файл
sed -i 's/error/warning/g' server.log
Опция -i перезаписывает исходный файл. Для безопасности можно создать резервную копию:
sed -i.bak 's/error/warning/g' server.log
Оригинальный файл сохранится как server.log.bak.
Регистронезависимая замена
Добавьте флаг I:
sed 's/error/warning/gI' server.log
Заменит "error", "Error", "ERROR" и любые другие варианты.
Работа с конкретными строками
Замена в определённой строке
Укажите номер строки перед командой:
sed '5s/old/new/' файл.txt
Замена произойдёт только в 5-й строке.
Замена в диапазоне строк
sed '10,20s/old/new/g' файл.txt
Обработает строки с 10-й по 20-ю включительно.
Замена от строки до конца файла
sed '100,$s/old/new/g' файл.txt
Символ $ обозначает последнюю строку файла.
Удаление строк
Удалить конкретную строку
sed '3d' file.txt
Удалит третью строку.
Удалить диапазон строк
sed '5,10d' file.txt
Удалить строки по шаблону
sed '/error/d' server.log
Удалит все строки, содержащие слово "error".
Удалить пустые строки
sed '/^$/d' файл.txt
Регулярное выражение ^$ обозначает пустую строку (начало строки сразу переходит в конец).
Удалить строки с комментариями
sed '/^#/d' config.conf
Удалит все строки, начинающиеся с символа #.
Добавление текста
Вставить строку после определённой
sed '/pattern/a New line of text' file.txt
Команда a (append) добавляет текст после строки с совпадением.
Пример: добавить комментарий после директивы в конфиге:
sed '/ServerName/a # Domain configuration' httpd.conf
Вставить строку перед определённой
sed '/pattern/i New line of text' file.txt
Команда i (insert) добавляет текст перед строкой.
Добавить текст в начало файла
sed '1i First line' file.txt
Добавить текст в конец файла
sed '$a Last line' file.txt
Практические примеры
Смена IP-адреса в конфигурационном файле
sed -i 's/192.168.1.100/10.0.0.50/g' /etc/nginx/sites-available/default
Замена пути к директории
sed -i 's|/var/www/html|/home/user/public_html|g' config.php
💡 Совет: когда в тексте много слешей, можно использовать другой разделитель — например, | или #. Это избавляет от необходимости экранировать каждый слеш.
Закомментировать строку
sed -i '/DirectoryIndex/s/^/#/' apache.conf
Добавит # в начало строки, содержащей "DirectoryIndex".
Раскомментировать строку
sed -i '/DirectoryIndex/s/^#//' apache.conf
Удалит # из начала строки.
Извлечь email-адреса из файла
sed -n 's/.*\([a-zA-Z0-9._%+-]*@[a-zA-Z0-9.-]*\.[a-zA-Z]\{2,\}\).*/\1/p' contacts.txt
Опция -n отключает автоматический вывод всех строк, а флаг p выводит только обработанные строки.
Убрать начальные и конечные пробелы
sed 's/^[ \t]*//;s/[ \t]*$//' file.txt
Две команды в одной строке, разделённые точкой с запятой.
Заменить несколько пробелов на один
sed 's/ */ /g' file.txt
Добавить строку в конкретное место конфига
Например, добавить параметр после секции [mysqld]:
sed -i '/\[mysqld\]/a max_connections = 500' /etc/mysql/my.cnf
Обработать несколько файлов сразу
sed -i 's/old_domain.com/new_domain.com/g' /etc/nginx/sites-available/*
Удалить строки между двумя паттернами
sed '/START/,/END/d' file.txt
Удалит все строки от "START" до "END" включительно.
Работа с регулярными выражениями
sed поддерживает регулярные выражения, что делает его ещё мощнее.
Замена цифр
sed 's/[0-9]/X/g' file.txt
Заменит все цифры на "X".
Удаление HTML-тегов
sed 's/<[^>]*>//g' page.html
Извлечение части строки
Используйте группы захвата с \( и \):
sed -n 's/.*IP: \([0-9.]*\).*/\1/p' access.log
Выведет только IP-адреса из строк вида "Connection from IP: 192.168.1.1".
Замена с использованием найденного текста
sed 's/\(error\)/[\1]/g' server.log
Обернёт слово "error" в квадратные скобки: [error].
Полезные опции sed
| Опция | Описание |
| -n | Отключает автоматический вывод строк |
| -e | Позволяет выполнить несколько команд |
| -i | Редактирует файл "на месте" |
| -r или -E | Включает расширенные регулярные выражения |
| -f | Читает команды из файла |
Пример использования нескольких команд
sed -e 's/error/warning/g' -e 's/critical/important/g' server.log
Или через точку с запятой:
sed 's/error/warning/g; s/critical/important/g' server.log
Чтение команд из файла
Создайте файл `commands.sed`:
s/error/warning/g
s/critical/important/g
/debug/d
Примените его:
sed -f commands.sed server.log
Комбинирование sed с другими утилитами
С grep для предварительной фильтрации
grep "error" server.log | sed 's/error/warning/g'
С find для обработки множества файлов
find /var/www -name "*.php" -exec sed -i 's/mysql_/mysqli_/g' {} \;
В pipe с другими командами
cat access.log | sed 's/^.*GET //' | sed 's/ HTTP.*//' | sort | uniq -c
Такая цепочка извлечёт из лога все запрошенные URL и покажет статистику обращений.
Частые ошибки и их решение
Проблема: замена не работает, потому что в тексте есть специальные символы.
Решение: экранируйте их обратным слешем или используйте другой разделитель:
Вместо этого:
sed 's/http://example.com/https://example.com/g'
Делайте так:
sed 's|http://example.com|https://example.com|g'
Проблема: sed выдаёт ошибку "invalid reference" при замене.
Решение: проверьте, не используете ли вы \1, \2 без соответствующих групп захвата \( и \).
Проблема: изменения не сохраняются в файл.
Решение: добавьте опцию -i:
sed -i 's/old/new/g' file.txt
Когда sed не подходит
Несмотря на мощность, sed — не универсальное решение:
- Для сложной логики и условий лучше использовать
awkили скриптовые языки - Для работы с бинарными файлами нужны специализированные утилиты
- Для масштабного рефакторинга кода удобнее IDE с функцией "
find and replace"
Но для быстрых правок конфигов, обработки логов и автоматизации типовых задач — sed незаменим.
Заключение
sed — это швейцарский нож для работы с текстом в командной строке. Освоив базовые команды замены, удаления и вставки, вы сможете за секунды выполнять задачи, на которые раньше уходили минуты ручной работы.
Начните с простых операций — замены текста в одном файле, постепенно усложняя команды. Со временем sed станет естественной частью вашего рабочего процесса, особенно при написании скриптов автоматизации.
Главное правило: перед использованием -i на важных файлах всегда делайте резервную копию или сначала проверяйте результат без этой опции. Одна опечатка в регулярном выражении может привести к неожиданным последствиям.