JavaRush /Курси /Docker SELF /Перетворення тексту за допомогою sed

Перетворення тексту за допомогою sed

Docker SELF
Рівень 8 , Лекція 1
Відкрита

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), переконайтеся, що вони вказані коректно — файл не повинен бути порожнім.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ