sed: потоковая замена

Массово заменяем и редактируем текст без открытия редактора.

sed (stream editor) — это потоковый редактор, который применяет правила преобразования к каждой строке текста.

Замена текста

Главная команда sed — подстановка s/что/на_что/. По умолчанию заменяется первое вхождение в строке.

echo "Привет, мир" | sed 's/мир/Bash/'

Вывод:

Привет, Bash

Чтобы заменить ВСЕ вхождения в строке, добавляют флаг g (global):

echo "a-a-a-a" | sed 's/a/X/g'

Вывод:

X-X-X-X

Удаление и выбор строк

sed умеет работать с адресами строк. d удаляет, число или диапазон выбирает строки.

sed '1d' file.txt
sed '2,4d' file.txt
sed -n '5,10p' file.txt

Первая команда выводит файл без первой строки, вторая — без строк 2–4, третья (-n + p) печатает только строки 5–10.

Редактирование файла на месте

По умолчанию sed печатает результат в stdout, не трогая файл. Флаг -i меняет файл прямо на диске:

sed -i 's/localhost/127.0.0.1/g' config.ini

Это удобно для пакетной правки конфигов. Но осторожно: изменения необратимы. Для подстраховки можно создать резервную копию: sed -i.bak 's/.../.../' file — оставит исходник в file.bak.

Как работает под капотом

sed читает вход построчно в «pattern space» (буфер строки), применяет к нему команды по порядку, затем печатает результат (если не указан -n) и переходит к следующей строке. Разделитель в s не обязан быть слэшем: если в тексте много слэшей (например, пути), удобнее s|/old/path|/new/path| — это избавляет от экранирования. sed обрабатывает поток лениво, поэтому годится для огромных файлов.

Частые ошибки

  • Забыть g. Без него заменится только ПЕРВОЕ вхождение в каждой строке.
  • -i без бэкапа на важном файле. Ошиблись в шаблоне — потеряли данные. Используйте -i.bak или сперва прогоните без -i.
  • Слэши в пути. s//var//tmp/ сломается; смените разделитель на s|/var|/tmp|.

Итог

  • sed 's/old/new/' заменяет первое вхождение, флаг g — все в строке.
  • Адреса строк: 1d удалить строку, -n '5,10p' напечатать диапазон.
  • -i правит файл на месте (необратимо); -i.bak оставляет резервную копию.
Проверьте себя
1. Что делает флаг g в команде sed 's/a/b/g'?
AИгнорирует регистр
BЗаменяет все вхождения в строке, а не только первое
CУдаляет строку
DДелает глобальную копию
2. Что делает sed -i по сравнению с обычным запуском?
AИгнорирует регистр
BПечатает результат в новый файл
CРедактирует исходный файл прямо на диске
DРаботает только с одной строкой
3. Почему для путей удобно писать sed 's|/var|/tmp|' вместо слэшей?
AТак быстрее
BСменив разделитель на |, не нужно экранировать слэши внутри путей
CСлэши вообще запрещены
DЭто требование -i