Способы оплаты Abuse

Команда sed: редактирование текста из командной строки

21.11.2025, 17:30
Содержание:

Работа с конфигурационными файлами, логами и скриптами — ежедневная рутина любого администратора. Открывать каждый файл в редакторе, искать нужную строку и вручную её менять? Долго и неэффективно. Именно для таких задач существует sed — stream editor, который позволяет редактировать текст прямо из командной строки.

Что такое sed и зачем он нужен

sed — это утилита для потокового редактирования текста в Unix-подобных системах. Она работает как конвейер: принимает текст на вход, обрабатывает его по заданным правилам и выводит результат.

Типичные задачи, которые решает sed:

  • Массовая замена текста в файлах
  • Удаление или добавление строк по условию
  • Извлечение нужных фрагментов из логов
  • Автоматизация правок в конфигах
  • Обработка данных в скриптах

Главное преимущество — скорость и возможность обработать сразу несколько файлов одной командой.

Базовый синтаксис

sed [опции] 'команда' файл

Самая частая опция — -i (in-place), которая сохраняет изменения прямо в исходном файле. Без неё sed просто выводит результат в консоль, не меняя оригинал.

Замена текста — основная функция sed

Простая замена

Базовая конструкция выглядит так:

sed 's/old_text/new_text/' file.txt

Пример: заменить первое вхождение слова "error" на "warning" в каждой строке:

sed 's/error/warning/' server.log

⚠️ Важно: по умолчанию sed заменяет только первое совпадение в строке.

Замена всех вхождений в строке

Добавьте флаг g (global) в конце команды:

sed 's/error/warning/g' server.log

Теперь заменятся все слова "error" в каждой строке, а не только первое.

Замена с сохранением в файл

sed -i 's/error/warning/g' server.log

Опция -i перезаписывает исходный файл. Для безопасности можно создать резервную копию:

sed -i.bak 's/error/warning/g' server.log

Оригинальный файл сохранится как server.log.bak.

Регистронезависимая замена

Добавьте флаг I:

sed 's/error/warning/gI' server.log

Заменит "error", "Error", "ERROR" и любые другие варианты.

Работа с конкретными строками

Замена в определённой строке

Укажите номер строки перед командой:

sed '5s/old/new/' файл.txt

Замена произойдёт только в 5-й строке.

Замена в диапазоне строк

sed '10,20s/old/new/g' файл.txt

Обработает строки с 10-й по 20-ю включительно.

Замена от строки до конца файла

sed '100,$s/old/new/g' файл.txt

Символ $ обозначает последнюю строку файла.

Удаление строк

Удалить конкретную строку

sed '3d' file.txt

Удалит третью строку.

Удалить диапазон строк

sed '5,10d' file.txt

Удалить строки по шаблону

sed '/error/d' server.log

Удалит все строки, содержащие слово "error".

Удалить пустые строки

sed '/^$/d' файл.txt

Регулярное выражение ^$ обозначает пустую строку (начало строки сразу переходит в конец).

Удалить строки с комментариями

sed '/^#/d' config.conf

Удалит все строки, начинающиеся с символа #.

Добавление текста

Вставить строку после определённой

sed '/pattern/a New line of text' file.txt

Команда a (append) добавляет текст после строки с совпадением.

Пример: добавить комментарий после директивы в конфиге:

sed '/ServerName/a # Domain configuration' httpd.conf

Вставить строку перед определённой

sed '/pattern/i New line of text' file.txt

Команда i (insert) добавляет текст перед строкой.

Добавить текст в начало файла

sed '1i First line' file.txt

Добавить текст в конец файла

sed '$a Last line' file.txt

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

Смена IP-адреса в конфигурационном файле

sed -i 's/192.168.1.100/10.0.0.50/g' /etc/nginx/sites-available/default

Замена пути к директории

sed -i 's|/var/www/html|/home/user/public_html|g' config.php

💡 Совет: когда в тексте много слешей, можно использовать другой разделитель — например, | или #. Это избавляет от необходимости экранировать каждый слеш.

Закомментировать строку

sed -i '/DirectoryIndex/s/^/#/' apache.conf

Добавит # в начало строки, содержащей "DirectoryIndex".

Раскомментировать строку

sed -i '/DirectoryIndex/s/^#//' apache.conf

Удалит # из начала строки.

Извлечь email-адреса из файла

sed -n 's/.*\([a-zA-Z0-9._%+-]*@[a-zA-Z0-9.-]*\.[a-zA-Z]\{2,\}\).*/\1/p' contacts.txt

Опция -n отключает автоматический вывод всех строк, а флаг p выводит только обработанные строки.

Убрать начальные и конечные пробелы

sed 's/^[ \t]*//;s/[ \t]*$//' file.txt

Две команды в одной строке, разделённые точкой с запятой.

Заменить несколько пробелов на один

sed 's/  */ /g' file.txt

Добавить строку в конкретное место конфига

Например, добавить параметр после секции [mysqld]:

sed -i '/\[mysqld\]/a max_connections = 500' /etc/mysql/my.cnf

Обработать несколько файлов сразу

sed -i 's/old_domain.com/new_domain.com/g' /etc/nginx/sites-available/*

Удалить строки между двумя паттернами

sed '/START/,/END/d' file.txt

Удалит все строки от "START" до "END" включительно.

Работа с регулярными выражениями

sed поддерживает регулярные выражения, что делает его ещё мощнее.

Замена цифр

sed 's/[0-9]/X/g' file.txt

Заменит все цифры на "X".

Удаление HTML-тегов

sed 's/<[^>]*>//g' page.html

Извлечение части строки

Используйте группы захвата с \( и \):

sed -n 's/.*IP: \([0-9.]*\).*/\1/p' access.log

Выведет только IP-адреса из строк вида "Connection from IP: 192.168.1.1".

Замена с использованием найденного текста

sed 's/\(error\)/[\1]/g' server.log

Обернёт слово "error" в квадратные скобки: [error].

Полезные опции sed

Опция

Описание

-n

Отключает автоматический вывод строк

-e

Позволяет выполнить несколько команд

-i

Редактирует файл "на месте"

-r или -E

Включает расширенные регулярные выражения

-f

Читает команды из файла

Пример использования нескольких команд

sed -e 's/error/warning/g' -e 's/critical/important/g' server.log

Или через точку с запятой:

sed 's/error/warning/g; s/critical/important/g' server.log

Чтение команд из файла

Создайте файл `commands.sed`:

s/error/warning/g
s/critical/important/g
/debug/d

Примените его:

sed -f commands.sed server.log

Комбинирование sed с другими утилитами

С grep для предварительной фильтрации

grep "error" server.log | sed 's/error/warning/g'

С find для обработки множества файлов

find /var/www -name "*.php" -exec sed -i 's/mysql_/mysqli_/g' {} \;

В pipe с другими командами

cat access.log | sed 's/^.*GET //' | sed 's/ HTTP.*//' | sort | uniq -c

Такая цепочка извлечёт из лога все запрошенные URL и покажет статистику обращений.

Частые ошибки и их решение

Проблема: замена не работает, потому что в тексте есть специальные символы.

Решение: экранируйте их обратным слешем или используйте другой разделитель:

Вместо этого:

sed 's/http://example.com/https://example.com/g'

Делайте так:

sed 's|http://example.com|https://example.com|g'

Проблема: sed выдаёт ошибку "invalid reference" при замене.

Решение: проверьте, не используете ли вы \1, \2 без соответствующих групп захвата \( и \).

Проблема: изменения не сохраняются в файл.

Решение: добавьте опцию -i:

sed -i 's/old/new/g' file.txt

Когда sed не подходит

Несмотря на мощность, sed — не универсальное решение:

  • Для сложной логики и условий лучше использовать awk или скриптовые языки
  • Для работы с бинарными файлами нужны специализированные утилиты
  • Для масштабного рефакторинга кода удобнее IDE с функцией "find and replace"

Но для быстрых правок конфигов, обработки логов и автоматизации типовых задач — sed незаменим.

Заключение

sed — это швейцарский нож для работы с текстом в командной строке. Освоив базовые команды замены, удаления и вставки, вы сможете за секунды выполнять задачи, на которые раньше уходили минуты ручной работы.

Начните с простых операций — замены текста в одном файле, постепенно усложняя команды. Со временем sed станет естественной частью вашего рабочего процесса, особенно при написании скриптов автоматизации.

Главное правило: перед использованием -i на важных файлах всегда делайте резервную копию или сначала проверяйте результат без этой опции. Одна опечатка в регулярном выражении может привести к неожиданным последствиям.