Работа с конфигурационными файлами, логами и скриптами — ежедневная рутина любого администратора. Открывать каждый файл в редакторе, искать нужную строку и вручную её менять? Долго и неэффективно. Именно для таких задач существует sed — stream editor, который позволяет редактировать текст прямо из командной строки.
sed — это утилита для потокового редактирования текста в Unix-подобных системах. Она работает как конвейер: принимает текст на вход, обрабатывает его по заданным правилам и выводит результат.
Типичные задачи, которые решает sed:
Главное преимущество — скорость и возможность обработать сразу несколько файлов одной командой.
sed [опции] 'команда' файл
Самая частая опция — -i (in-place), которая сохраняет изменения прямо в исходном файле. Без неё 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
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
Удалит # из начала строки.
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".
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].
|
Опция |
Описание |
|
-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
grep "error" server.log | sed 's/error/warning/g'
find /var/www -name "*.php" -exec sed -i 's/mysql_/mysqli_/g' {} \;
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 — не универсальное решение:
awk или скриптовые языкиfind and replace"Но для быстрых правок конфигов, обработки логов и автоматизации типовых задач — sed незаменим.
sed — это швейцарский нож для работы с текстом в командной строке. Освоив базовые команды замены, удаления и вставки, вы сможете за секунды выполнять задачи, на которые раньше уходили минуты ручной работы.
Начните с простых операций — замены текста в одном файле, постепенно усложняя команды. Со временем sed станет естественной частью вашего рабочего процесса, особенно при написании скриптов автоматизации.
Главное правило: перед использованием -i на важных файлах всегда делайте резервную копию или сначала проверяйте результат без этой опции. Одна опечатка в регулярном выражении может привести к неожиданным последствиям.