Полное руководство по команде sed в Linux

Обзор

В этой статье рассматривается команда sed — мощный потоковый редактор, позволяющий быстро и точно заменять и редактировать содержимое текстовых файлов в среде Linux. На практических примерах мы разберем всё: от базовой замены строк до удаления определенных строк и редактирования файлов на месте с созданием резервной копии с помощью опции -i.

1. Подготовка среды и базовая замена строк в sed (команда s)

Чтобы безопасно практиковаться в работе с командой sed, создадим специальный каталог и перейдем в него с помощью команды mkdir -p ~/sed_practice && cd ~/sed_practice.

mkdir -p ~/sed_practice && cd ~/sed_practice

Для подготовки тестовых данных, используемых в примерах замены строк, выполним команду echo -e 'apple is delicious\nbanana is yellow\napple is red' > fruits.txt, чтобы записать содержимое в файл.

echo -e ‘apple is delicious\nbanana is yellow\napple is red’ > fruits.txt

Команда sed — это потоковый редактор для обработки и модификации текстовых потоков.
Используя команду замены s, заменяем первое вхождение строки apple в каждой строке на orange и выводим результат на экран.
Содержимое исходного файла fruits.txt не изменяется — результат выводится только в стандартный вывод.
⚙️ [Основные опции]

-i : изменяет исходный файл напрямую на месте вместо вывода результата на экран.
-e : позволяет объединять и выполнять несколько команд редактирования одновременно.
-n : подавляет автоматический вывод пространства шаблонов и выводит только явно указанные строки.
-E или -r : включает синтаксис расширенных регулярных выражений (ERE).

sed ’s/apple/orange/’ fruits.txt

Добавление флага g в конец выражения замены выполняет глобальную (global) замену всех совпадений в каждой строке.
Это полезно, когда в одной строке встречается несколько одинаковых шаблонов поиска и их нужно заменить все без исключения.

sed ’s/apple/orange/g’ fruits.txt

2. Выборочный вывод и удаление строк (команда d и опция -n)

Для подготовки данных логов, необходимых для практического занятия по выбору и удалению строк, создадим пример файла с помощью команды echo -e 'Line 1: Server OK\nLine 2: Server Warning\nLine 3: Server Error\nLine 4: Server OK' > server.log.

echo -e ‘Line 1: Server OK\nLine 2: Server Warning\nLine 3: Server Error\nLine 4: Server OK’ > server.log

Комбинация опции -n и команды p позволяет вывести на экран только указанный диапазон строк — со 2-й по 3-ю.
Это удобно, когда нужно подавить стандартный автоматический вывод и просмотреть только интересующие строки.

sed -n ‘2,3p’ server.log

С помощью команды d и сопоставления по шаблону исключаются строки, содержащие строку Warning, а на экран выводятся только остальные строки.
Этот способ применяется для фильтрации ненужных логов или строк, соответствующих определенному условию.

sed ‘/Warning/d’ server.log

Указав конкретный номер строки и выполнив команду d, мы удаляем 2-ю строку и выводим результат на экран.
Это используется, когда необходимо удалить строку с определенным номером и просмотреть содержимое файла.

sed ‘2d’ server.log

3. Прямое редактирование исходного файла и автоматическое резервное копирование (опция -i)

Для практического занятия по редактированию конфигурационных файлов создадим файл config.env, содержащий примеры переменных окружения.

echo -e ‘PORT=8080\nDEBUG=true\nTIMEOUT=30’ > config.env

С помощью опции -i.bak создается резервная копия исходного файла config.env.bak и одновременно с этим параметр DEBUG=true заменяется на DEBUG=false с сохранением изменений прямо в исходном файле.
Это позволяет безопасно сохранить исходное состояние перед внесением изменений в оригинальный файл.

sed -i.bak ’s/DEBUG=true/DEBUG=false/’ config.env

Проверим содержимое измененного файла config.env с помощью команды cat.
Видно, что значение DEBUG успешно изменено на false и сохранено в файле.

cat config.env

Выведем содержимое автоматически созданного файла резервной копии config.env.bak.
Исходное состояние до модификации (DEBUG=true) сохранилось без изменений, что подтверждает успешное создание резервной копии.

cat config.env.bak

4. Продвинутая замена текста с использованием регулярных выражений и альтернативных разделителей

Для подготовки примера данных с путями к файлам запишем содержимое в файл paths.txt с помощью команды echo.

echo -e ‘Old path: /usr/local/bin\nNew path: /usr/local/bin’ > paths.txt

Используя символ вертикальной черты (|) в качестве разделителя замены вместо стандартного слэша (/), безопасно заменим путь /usr/local/bin на /usr/bin и выведем результат.
При работе с путями к файлам или URL-адресами, содержащими слэши, это позволяет писать выражения аккуратно, без использования экранирующих символов (\).

sed ’s|/usr/local/bin|/usr/bin|g’ paths.txt

Чтобы попрактиковаться в удалении пробелов с помощью регулярных выражений, создадим тестовый файл spaces.txt, содержащий начальные и конечные пробелы.

echo -e ’   leading spaces\nno spaces\n   trailing removed   ’ > spaces.txt

Используя символ начала строки ^ в сочетании с регулярным выражением [ \t]*, задающим пробелы и символы табуляции, удаляем все начальные пробелы в каждой строке и выводим результат.
Это полезно для быстрой пакетной очистки отступов в документах или лог-файлах.

sed ’s/^[ \t]*//’ spaces.txt

В этом руководстве мы рассмотрели ключевые аспекты работы с командой sed в Linux: от базовой замены текста до пакетной модификации файлов.
Это мощный инструмент, который существенно сокращает рутинную работу по редактированию файлов, поэтому обязательно используйте его в своих повседневных задачах.