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