1. Синтаксис команды sed
Что такое sed?
sed (аббревиатура от Stream Editor, то есть потоковый редактор) — это мощная утилита для обработки текста, которая позволяет изменять, добавлять, удалять или трансформировать строки в текстовых файлах и потоках данных.
Главная магия sed заключается в том, что он редактирует текст "на лету", не затрагивая оригинальный файл (если вы сами об этом не попросите). Это делает его идеальным инструментом для быстрого и автоматического преобразования данных.
Основной синтаксис команды
Возьмём основную формулу для работы с sed:
sed [опции] 'шаблон/действие' файл
Где:
шаблон— это текст или регулярное выражение, по которому будет производиться поиск.действие— операция, которую вы хотите выполнить (например, замена текста).файл— текстовый файл, содержащий строки, которые вы хотите изменить.
Для простоты на первых порах мы сосредоточимся на самых популярных действиях: замене текста (s — от слова "substitute") и удалении строк (d — от слова "delete").
2. Замена текста s/старое/новое/
Пример 1: Элементарная замена текста
Допустим, у нас есть файл example.txt с содержимым:
Hello world!
Welcome to Linux.
Linux is awesome.
Попробуем заменить слово "Linux" на sed:
sed 's/Linux/sed/' example.txt
Вывод будет следующим:
Hello world!
Welcome to sed.
sed is awesome.
Вот и всё. Слово "Linux" было заменено на sed только один раз в каждой строке. Это стандартное поведение.
Пример 2: Глобальная замена
Если нужно заменить все вхождения слова вместо первого в строке, добавьте флаг g (глобально):
sed 's/Linux/sed/g' example.txt
Если в строке несколько упоминаний "Linux", то они все будут заменены на sed.
Пример 3: Игнорирование регистра
Для замены текста без учёта регистра добавьте флаг I (или i в зависимости от вашей версии):
sed 's/linux/sed/gi' example.txt
Это заменит слова "Linux", "LINUX", "LiNuX" и т.д.
Пример 4: Замена с сохранением результата
По умолчанию sed просто выводит результат в консоль, не изменяя файл. Если вы хотите записать изменения обратно в файл, добавьте опцию -i (in-place):
sed -i 's/Linux/sed/g' example.txt
Теперь файл example.txt будет обновлён с заменами.
3. Удаление строк /шаблон/d
Пример 1: Удаление строк по шаблону
Если вы хотите удалить все строки, содержащие слово "Linux":
sed '/Linux/d' example.txt
Вывод будет таким:
Hello world!
Здесь удалены строки, где фигурирует "Linux".
Удаление строк по номеру
Можно удалить строку по её номеру. Например, чтобы удалить вторую строку, используем:
sed '2d' example.txt
Вывод:
Hello world!
Linux is awesome.
Удаление нескольких строк: укажите диапазон, например, удалить строки с 2-й по 3-ю:
sed '2,3d' example.txt
4. Работа с регулярными выражениями
Вот где sed сияет своей мощью! В шаблонах можно использовать регулярные выражения для поиска более сложных совпадений.
Пример 1: Замена слов с определённым шаблоном
Допустим, в тексте есть строки:
error: something went wrong
warning: check your system
error: unable to connect
Мы хотим заменить все строки, начинающиеся с "error", на "Issue Detected". В этом помогут регулярные выражения:
sed 's/^error:.*/Issue Detected/' logs.txt
Где:
^— указывает на начало строки..*— означает "всё, что угодно после".
Результат:
Issue Detected
warning: check your system
Issue Detected
5. Вставка и добавление строк
Вставка строки перед совпадением
Чтобы вставить строку перед каждой строкой, содержащей "Linux":
sed '/Linux/i\# Learning is fun' example.txt
Результат:
Hello world!
Welcome to Linux.
# Learning is fun
Linux is awesome.
Пример 2: Добавление строки после совпадения
Для добавления текста после строки с шаблоном:
sed '/Linux/a\# sed makes it easier' example.txt
Результат:
Hello world!
Welcome to Linux.
# sed makes it easier
Linux is awesome.
# sed makes it easier
6. Практика: обработка конфигурационных файлов
Попробуем решить практическую задачу. Представьте, что у вас есть конфигурационный файл config.txt:
host=localhost
port=8080
mode=production
logfile=/var/log/app.log
Задача 1: Заменить "localhost" на "127.0.0.1"
sed -i 's/localhost/127.0.0.1/' config.txt
Результат:
host=127.0.0.1
port=8080
mode=production
logfile=/var/log/app.log
Задача 2: Увеличить порт на 1
Для этого используем sed с небольшим трюком:
sed -i 's/port=8080/port=8081/' config.txt
Результат:
host=127.0.0.1
port=8081
mode=production
logfile=/var/log/app.log
Задача 3: Удалить строки с logfile
Если конфигурация больше не требует ведения логов, удалим строку:
sed -i '/logfile/d' config.txt
Результат:
host=127.0.0.1
port=8081
mode=production
7. Комбинация с другими командами
sed отлично работает в связке с другими инструментами Linux. Например:
grep "error" logs.txt | sed 's/error/ERROR/'
Здесь мы сначала ищем строки с ошибками, а затем форматируем их.
Типичные ошибки и как их избегать
- Ошибка: забыли опцию
-i. Новички часто ждут, чтоsedизменит файл, но не добавляют-i. Не забудьте явно указать это, если вы хотите внести изменения в файл. - Ошибка: кавычки. В некоторых системах, особенно если используются одиночные кавычки,
\перед спецсимволами может работать некорректно. Всегда правильно экранируйте символы. - Ошибка с диапазонами строк. Если вы используете диапазоны (например,
2,3d), убедитесь, что они указаны корректно — файл не должен быть пустым.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ