sed — потоковый редактор для массовых текстовых преобразований в командной строке

Что такое sed и когда он пригодится
sed (stream editor) — это консольная утилита, которая считывает поток текста (строку, вывод команды или файл), последовательно применяет правила поиска/замены/вставки/удаления и выводит результат. Ключевые сценарии применения:
- Быстрая замена текста в выводе команд (например, ls | sed …).
- Массовая правка файлов (с опцией -i для редактирования на месте).
- Встраивание в скрипты для автоматической обработки логов, конфигов и данных.
Определение: Регулярное выражение — компактный способ описать шаблон текста для поиска и захвата.
Important: перед массовой операцией всегда проверяйте команду без -i и делайте резервную копию файлов.
Быстрые проверки установки
Чтобы узнать, установлен ли sed, выполните:
sed --version
Если sed отсутствует, установите его в зависимости от дистрибутива:
- Ubuntu/Debian:
sudo apt install sed - RedHat/CentOS/Fedora:
sudo yum install sed(илиdnfна новых версиях)
Примечание: на macOS по умолчанию установлен BSD sed, с немного отличающейся реализацией опции -i. Про совместимость — ниже.
Основной пример: поиск и замена в строке
Самая простая команда замены имеет вид:
echo 'Hello Cloud Savvy IT fans!' | sed 's/Cloud Savvy IT/cloudsavvyit.com/'Где:
s— команда замены (substitute).- Первый аргумент — шаблон поиска (from).
- Второй аргумент — замена (to).
- Разделитель по умолчанию —
/, но можно выбрать любой символ.
Общий вид: s|from|to| — здесь вертикальная черта | служит разделителем.
Результат: часть строки заменяется без изменения остального текста.
Работа с файлами и опция -i
Чтобы изменить файл в месте, используется -i:
echo -e 'one\ntwo\nThree' > sample.txt
cat sample.txt
sed -i 's/two/2/' sample.txt
cat sample.txt>создаёт новый файл или перезаписывает существующий;>>добавляет в конец.sed -iредактирует файл «на месте». На macOS (BSD sed) опция-iтребует аргумента для создания резервной копии:-i ''применит изменение без создания файла-резервной копии,-i .bakсоздаст файл с расширением .bak.
Важно: прежде чем запускать -i на рабочих данных, прогоните ту же команду без -i и проверьте вывод.

Флаги замены: глобально и нечувствительно к регистру
Команда замены поддерживает дополнительные флаги после завершающего разделителя:
g— global, заменить все вхождения в строке (а не только первое).i— case-insensitive, нечувствительность к регистру.
Пример комбинирования и нескольких инструкций:
sed -i 's|h|_H|gi; s|\.com||g' file.txtЗдесь первая инструкция заменяет h на _H во всех вхождениях вне зависимости от регистра; вторая удаляет все .com (заменяет на пустую строку). Обратите внимание на экранирование . как \. в регулярных выражениях.

Разделители и экранирование
Стандартный разделитель / удобен, но мешает при работе с путями (например, /usr/local/bin). В таких случаях полезно выбрать другой разделитель, например |, # или @:
sed 's|/old/path|/new/path|g' fileЭкранируйте специальные символы регулярного выражения (., *, ?, +, ^, $, [], () и др.) обратным слэшем \ при необходимости точного поиска.
Вставка и чтение из файла
sed умеет не только заменять текст, но и вставлять/вставлять содержимое другого файла с помощью команды r (read):
# вставить содержимое inject.txt после каждой второй строки
sed '2~2 r inject.txt' source.txtВ примере ниже мы создаём файл и вставляем разделитель --- после каждой второй строки:

Команда r принимает имя файла внутри основной инструкции без дополнительного разделителя.
Адресация строк — работа с диапазонами и номерами строк
sed позволяет применять инструкции к определённым строкам или диапазонам:
- По номеру:
5s/foo/bar/— выполнить замену только в строке 5. - Диапазон:
2,4s/a/b/g— строки с 2 по 4. - Регулярное совпадение как адрес:
/^#/,/END/ s/old/new/g— от строки, начинающейся с#, до строки содержащейEND. - Шаги:
1~2— каждая вторая строка, начиная с 1.
Пример замены только в строках, содержащих 3:
echo -e '1\n2\n3: C\n4' > file.txt
sed '/3/s/C/Z/' file.txt
Обработка вывода других команд
Частый паттерн — брать вывод команды и прогонять через sed. Например:
ls -1 | sed 's/ /_/g'Это заменит пробелы на подчёркивания в строках вывода ls.
Практические советы по безопасности и тестированию
- Всегда проверяйте результат без
-i: сначала выполните команду и посмотрите вывод. - Для массовых правок создавайте резервные копии или используйте контрейнеры/тестовые окружения.
- На macOS используйте
sed -i '' 's/a/b/g' file(обратите внимание на пустую строку после -i). - Если команда использует сложные кавычки или переменные оболочки, экранируйте их или используйте кавычки правильного типа.
Важно: регулярные выражения могут вести к неожиданным заменам. Тестируйте на примерах и включайте границы (\b, ^, $) при необходимости.
Когда sed не подойдёт (ограничения и контрпримеры)
- При сложной логике, условных заменах или парсинге многоуровневых структур (JSON, HTML) лучше использовать специализированные инструменты (jq, html parser, программирование на Python/Perl).
- Для потоковой аналитики с агрегациями и арифметикой чаще удобнее awk.
- Если нужно атомарно менять бинарные файлы, sed не лучший выбор.
Альтернативы и сравнение
- awk — мощнее для разбора полей, вычислений и условных правил.
- perl — имеет чрезвычайно мощные регулярные выражения и подходит для сложных шаблонов и многопозиционных замен.
- python — самый гибкий для длинных сценариев с библиотеки для работы с JSON, CSV и др.
Короткая матрица выбора:
- Простая замена в тексте или файле → sed
- Обработка колонок, вычисления → awk
- Сложные текстовые трансформации и многопроходная логика → perl/python
Совместимость: GNU sed vs BSD sed (macOS)
- GNU sed (обычно в Linux):
sed -iможно использовать без аргумента. - BSD sed (macOS):
sed -iтребует аргумента для резервной копии;-i ''— применяет изменения без создания бэкапа.
Пример для macOS:
sed -i '' 's/foo/bar/g' file.txtЕсли ваш скрипт должен работать в разных ОС, используйте проверку окружения или избегайте -i и заменяйте файл через временный файл:
sed 's/foo/bar/g' file.txt > file.txt.tmp && mv file.txt.tmp file.txtПолезные сниппеты и шпаргалка (cheat sheet)
- Замена первого вхождения в строке:
sed 's/old/new/' file - Замена всех вхождений в строке:
sed 's/old/new/g' file - Нечувствительная к регистру:
sed 's/old/new/gi' file - Редактирование на месте с бэкапом:
sed -i.bak 's/old/new/g' file - Применить несколько инструкций:
sed -e 's/a/b/g' -e 's/c/d/g' file - Запустить скрипт sed из файла
script.sed:sed -f script.sed file - Вставить содержимое файла после строки N:
sed 'N r insert.txt' file - Удалить строки, содержащие шаблон:
sed '/pattern/d' file
Ментальные модели и эвристики
- Model: sed читает поток построчно и применяет инструкцию(и) к каждой строке по порядку.
- Heuristic: сначала протестируй на небольшом файле/строке; затем масштабируй на реальные данные.
- Если вы чувствуете, что начинаете «писать программу» в sed — лучше перейти на Perl/Python.
Рольные чек-листы при использовании sed
Sysadmin:
- Тестировать команду без -i
- Держать резервную копию конфигураций
- Проверять совместимость sed на целевых серверах
Разработчик/DevOps:
- Интегрировать тесты на CI, если sed используется в билд-скриптах
- Логировать изменения для отката
Data engineer:
- Оценить, не лучше ли использовать jq или pandas при структурированных данных
- Проверить кодировку файлов (UTF-8)
Критерии приёмки
- Скрипт sed прошёл на тестовом наборе файлов без потери данных.
- Для массового изменения создана резервная копия или применён безопасный поток (temp-файл).
- Результаты совпадают с требованиями по форматированию и шаблонам.
Тестовые случаи и приёмочные проверки
- Замена простого шаблона — проверить, что все требуемые вхождения заменены.
- Нечувствительность к регистру — проверить
iфлаг. - Исполнение с путями — проверить разные разделители.
- Совместимость — проверить поведение на Linux (GNU sed) и macOS (BSD sed).
- Резервное восстановление — убедиться в наличии бэкапа или возможности отката.
Быстрый сценарий отката (runbook)
- Если использовалась
-i.bak, восстановите из.bak:mv file.txt.bak file.txt - Если использовался временный файл как
file.txt.tmp, замените:mv file.txt.tmp file.txt - Если изменений много, восстановите из версии контроля (git) или бэкапа.
Решающее дерево для выбора инструмента (Mermaid)
flowchart TD
A[Нужно преобразовать текст?] --> B{Структура данных}
B -->|Не структурировано, простые замены| C[Используйте sed]
B -->|Колонки, вычисления| D[Используйте awk]
B -->|JSON/CSV| E[Используйте jq или pandas]
B -->|Сложная логика| F[Используйте perl или python]Краткое руководство по отладке
- Добавляйте
p(print) и флаг-nдля подробного просмотра, что делает sed:sed -n 's/foo/bar/p' file— покажет только строки, где произошла замена. - Используйте
--debugв GNU sed (если доступно) или разбивайте скрипт на шаги.
Резюме
sed — компактный и быстрый инструмент для массовых текстовых трансформаций в терминале. Для безопасной работы придерживайтесь правил: тестируйте команды без -i, делайте резервные копии, учитывайте различия между реализациями sed и выбирайте другой инструмент (awk, perl, python) при усложнении логики. С начальных простых примеров вы быстро освоите шаблоны, разделители и адресацию строк, а затем сможете комбинировать инструкции и интегрировать sed в скрипты и CI.
Дополнительные ссылки и литература: читайте руководства по регулярным выражениям, документацию GNU sed и руководства по совместимости для macOS.
Important: всегда проверяйте команды и сохраняйте резервные копии перед массовыми изменениями.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone