Цель урока: Освоить базовые, но самые важные возможности потокового редактора sed (Stream Editor). Мы научимся выполнять операцию "найти и заменить" в файлах и текстовых потоках, не открывая их в интерактивном редакторе. Это фундаментальный навык для автоматизации редактирования конфигурационных файлов, обработки данных и подготовки отчетов.

Часть 1: Теория. Что такое sed и в чем его суперсила?

Представьте, что grep - это ваш детектив. Он тщательно изучает текст и находит нужные вам строки, но ничего в них не меняет.

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

Ключевая концепция: sed работает как поток. Он не изменяет оригинальный файл (если не попросить его об этом специально). Он читает строку, применяет к ней ваши инструкции, выводит измененную строку на экран (в stdout), берет следующую строку и так далее. Это делает его невероятно мощным и безопасным инструментом: вы всегда можете сначала посмотреть на результат его работы на экране и только потом, убедившись, что все правильно, сохранить изменения в файл.

Где это используется постоянно?

  • Автоматическое изменение конфигов: Вам нужно в скрипте изменить параметр port = 8080 на port = 9000 в конфигурационном файле. sed сделает это одной командой.

  • Очистка данных: Убрать из лог-файла лишние пробелы, заменить ERROR на [CRITICAL] или удалить метки времени.

  • Массовое переименование: В связке с другими командами sed может изменять части имен файлов.

Часть 2: Практика. Основная команда sed - замена (s)

Самая частая (95% случаев) операция в sed - это замена.

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

sed 's/ШАБЛОН/ЗАМЕНА/ФЛАГИ' /путь/к/файлу
  • sed: Имя команды.

  • '...': Одинарные кавычки. Внутри них мы пишем нашу инструкцию для sed.

  • s: Команда "substitute" (заменить).

  • /: Разделитель. Классический разделитель - слэш /, но можно использовать почти любой другой символ (@#|), что очень удобно, когда вы работаете с путями к файлам (где много слэшей).

  • ШАБЛОН: Что мы ищем. Это может быть простое слово или регулярное выражение (те же, что мы начали изучать с grep).

  • ЗАМЕНА: На что мы меняем найденный шаблон.

  • ФЛАГИ: Необязательные модификаторы, которые управляют поведением замены.

  • /путь/к/файлу: Входной файл. Если его нет, sed читает из стандартного ввода (после |).

Подготовка к экспериментам:
Давайте создадим тестовый файл, на котором будем практиковаться.

cd ~/scripts
# Используем cat с перенаправлением для создания файла с текстом
cat > sed_test.txt << EOL
Hello world. This is a test file.
The word test appears twice in this test line.
Another line without the keyword.
This is a Test, with a capital letter.

Теперь у нас есть файл sed_test.txt для экспериментов.

Пример 1: Простая замена (первое вхождение)
Заменим слово test на example.

sed 's/test/example/' sed_test.txt

Результат на экране:

Hello world. This is a example file.
The word example appears twice in this test line.
Another line without the keyword.
This is a Test, with a capital letter.

Что мы видим:

  • Оригинальный файл sed_test.txt не изменился! (Проверьте командой cat sed_test.txt). sed лишь вывел результат на экран.

  • Во второй строке sed заменил только первое слово test. По умолчанию, он останавливается после первого совпадения в строке.

Пример 2: Глобальная замена (флаг g)
Теперь заменим все вхождения test в каждой строке.

  • Флаг g (global): Говорит sed не останавливаться после первого совпадения, а продолжать поиск до конца строки.

sed 's/test/example/g' sed_test.txt

Результат на экране:

Hello world. This is a example file.
The word example appears twice in this example line.
Another line without the keyword.
This is a Test, with a capital letter.

Теперь оба слова test во второй строке заменены.

Пример 3: Замена без учета регистра (флаг i)
Заменим и test, и Test.

  • Флаг i (insensitive): Делает поиск нечувствительным к регистру.

sed 's/test/example/gi' sed_test.txt

Результат на экране:

Hello world. This is a example file.
The word example appears twice in this example line.
Another line without the keyword.
This is a example, with a capital letter.

Теперь замена произошла и в последней строке.

Часть 3: Практика. Сохранение изменений в файл (-i)

Когда вы посмотрели на вывод и уверены, что sed делает то, что нужно, можно применить изменения к файлу.

ОПЦИЯ -i (in-place): Эта опция говорит sed редактировать файл "на месте", то есть перезаписать его измененной версией.

ВНИМАНИЕ: Эта операция необратима. Хорошей практикой является сначала создать резервную копию. Опция -i может сама создать бэкап, если указать расширение.

  • -i.bakСначала создаст копию файл.bak, а потом изменит оригинальный файлЭто самый безопасный способ.

  • -i: Просто изменит файл без создания копии. Используйте с осторожностью!

Пример: Давайте наконец-то сохраним наши изменения, предварительно создав бэкап.

sed -i.bak 's/test/example/gi' sed_test.txt
  • Новый файл sed_test.txt.bak - это ваша страховка, он содержит оригинальный текст.

  • Файл sed_test.txt теперь содержит измененный текст.

Часть 4: Продвинутые примеры и заключение

1. Использование sed в конвейерах (|)
sed прекрасно работает с данными, "прилетающими" от других команд.

# Посмотреть IP-адреса, но убрать кавычки, которые может добавлять какая-нибудь утилита
# some_command | sed 's/"//g'

2. Использование других разделителей
Это критически важно при работе с путями. Представьте, что нам нужно заменить /usr/local/bin на /opt/bin.

# Ужасный, нечитаемый вариант со слэшами:
sed 's/\/usr\/local\/bin/\/opt\/bin/g' some_config.conf

# Прекрасный, читаемый вариант с другим разделителем (@):
sed 's@/usr/local/bin@/opt/bin@g' some_config.conf

Результат будет абсолютно одинаковым, но второй вариант гораздо проще для восприятия.

3. Применение команды только к определенным строкам
Вы можете указать sed адрес - номер строки или шаблон, к которому нужно применить команду.

# Заменить 'test' на 'example' только во второй строке
sed '2s/test/example/g' sed_test.txt

# Заменить 'test' на 'example' только в строках, где есть слово 'twice'
sed '/twice/s/test/example/g' sed_test.txt

Заключение:
Мы освоили самую главную и самую используемую функцию sed - поиск и замену. Вы научились безопасно применять изменения, работать с потоками данных и использовать хитрости для улучшения читаемости. Даже этих знаний уже достаточно для автоматизации огромного пласта задач по редактированию конфигурационных файлов. sed умеет делать и многие другие вещи (удалять строки, вставлять текст), но именно операция s/ является его визитной карточкой.

На следующем, 19-м уроке, мы познакомимся с последним гигантом обработки текста - awk. Если grep ищет строки, а sed их изменяет, то awk - это инструмент для анализа структурированных данных. Он "видит" текст не как набор строк, а как таблицу со столбцами, и позволяет производить вычисления, форматировать вывод и создавать сложные отчеты прямо в командной строке.

Перейти к просмотру - УРОК №19.

подарок Промо-код: PROMO15 - скидка 15%! огонь

Введите при оформлении первого заказа на сайте: Hosting-VDS.com

авторское право цифровые решения

Помог ли вам данный ответ? 0 Пользователи нашли это полезным (0 голосов)