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оставляет резервную копию.