Gymterview
middle

Как использовать sed для обработки текста?

sed (Stream Editor) — потоковый редактор для преобразования текста. Читает текст построчно, применяет правила и выводит результат, не загружая весь файл в память.

Аналогия

sed — это корректор текста на конвейере: каждая страница (строка) проезжает мимо него, он вносит исправления по заданным правилам и отправляет дальше. Оригинал при этом можно не трогать.

Замена текста (s — substitute)

Пример
# Базовая замена (первое вхождение в каждой строке)
sed 's/old/new/' file.txt

# Глобальная замена (все вхождения в каждой строке)
sed 's/old/new/g' file.txt

# Замена с игнорированием регистра
sed 's/error/WARNING/gi' file.txt

# Замена на месте (изменить сам файл)
sed -i 's/localhost/0.0.0.0/g' config.yml

# С созданием резервной копии
sed -i.bak 's/localhost/0.0.0.0/g' config.yml   # Создаст config.yml.bak

# Использование другого разделителя (удобно при работе с путями)
sed 's|/usr/local/bin|/opt/bin|g' script.sh
sed 's#http://#https://#g' urls.txt

Удаление строк (d — delete)

Пример
sed '5d' file.txt                # Удалить 5-ю строку
sed '3,7d' file.txt              # Удалить строки с 3 по 7
sed '$d' file.txt                # Удалить последнюю строку
sed '/^#/d' config.txt           # Удалить комментарии (строки, начинающиеся с #)
sed '/^$/d' file.txt             # Удалить пустые строки
sed '/DEBUG/d' app.log           # Удалить строки, содержащие "DEBUG"

Вставка и добавление

Пример
sed '3i\Новая строка' file.txt   # Вставить перед 3-й строкой (insert)
sed '3a\Новая строка' file.txt   # Вставить после 3-й строки (append)
sed '1i\#!/bin/bash' script.sh   # Добавить shebang в начало скрипта

Работа с диапазонами

Пример
# Замена только в строках 10-20
sed '10,20s/foo/bar/g' file.txt

# Замена между двумя паттернами
sed '/BEGIN/,/END/s/old/new/g' file.txt

Практические примеры

Пример
# Убрать пробелы в конце строк
sed 's/[[:space:]]*$//' file.txt

# Заменить версию в pom.xml
sed -i 's/<version>1.0.0<\/version>/<version>1.1.0<\/version>/' pom.xml

# Извлечь значение из properties-файла
sed -n 's/^server\.port=\(.*\)/\1/p' application.properties

# Вставить строку после совпадения
sed '/spring:/a\  profiles:\n    active: dev' application.yml

# Показать только строки с 10 по 20 (-n подавляет автовывод, p — печатать)
sed -n '10,20p' file.txt

На собеседовании: интервьюер ожидает знание базового синтаксиса замены s/old/new/g, флага -i для редактирования на месте и умение выбирать другой разделитель при работе с путями. Частая ошибка — забывать g (без него заменяется только первое вхождение в строке) и не знать про -i.bak для безопасного редактирования.