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\# Навчання — це круто' example.txt
Результат:
Hello world!
Welcome to Linux.
# Навчання — це круто
Linux is awesome.
Приклад 2: Додавання рядка після збігу
Для додавання тексту після рядка з шаблоном:
sed '/Linux/a\# sed робить це легше' example.txt
Результат:
Hello world!
Welcome to Linux.
# sed робить це легше
Linux is awesome.
# sed робить це легше
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), переконайтеся, що вони вказані коректно — файл не повинен бути порожнім.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ