Команда SED у Linux/Unix на прикладах

Команда SED у Linux/Unix на прикладах
10 хв. читання
09 червня 2022

SED – це потоковий редактор тексту (від stream editor), за допомогою якого можна виконувати з файлами безліч операцій на кшталт пошуку та заміни, вставки чи видалення. При цьому найчастіше він використовується саме для пошуку та заміни.

SED дозволяє редагувати файли, не відкриваючи, що суттєво прискорює роботу, ніж при використанні того самого vi. Крім того, SED підтримує регулярні вирази, за допомогою яких можна виконувати складне зіставлення шаблонів.

Загальний синтаксис команди sed виглядає так:

sed OPTIONS... [SCRIPT] [INPUTFILE...] 

Самі ж варіанти використання ми розглянемо наприкладі наступного тексту:

cat > geekfile.txt
unix is great os. unix is opensource. unix is free os.
learn operating system.
unix linux which one you choose.
unix is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.

Приклади команд

1. Заміна або підстановка рядка

Наступна команда замінить у цільовому файлі входження слова unix на linux:

sed 's/unix/linux/' geekfile.txt

Результат:

linux is great os. unix is opensource. unix is free os.
learn operating system.
linux linux which one you choose.
linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.

Тут s означає операцію заміни, а прямі слеші / виступають роздільниками. unix використовується як шаблон пошуку, linux - заміна

За замовчуванням команда sed замінює перше входження шаблону в кожному рядку, не торкаючись другого, третього і т.д.

2. Заміна n-ого входження шаблону в рядку

Входження, які потрібно замінити, позначаються за допомогою прапорів /1 і /2 т.д. Наприклад, наступна команда замінить у кожному рядку друге входження:

sed 's/unix/linux/2' geekfile.txt

Результат:

unix is great os. linux is opensource. unix is free os.
learn operating system.
unix linux which one you choose.
unix is easy to learn.linux is a multiuser os.Learn unix .unix is a powerful.

3. Заміна всіх входжень шаблону у файлі

Для заміни всіх без винятку входжень заданого шаблону використовується прапор /g (глобальна заміна):

sed 's/unix/linux/g' geekfile.txt

Результат:

linux is great os. linux is opensource. linux is free os.
learn operating system.
linux linux which one you choose.
linux is easy to learn.linux is a multiuser os.Learn linux .linux is a powerful.

4. Заміна всіх входжень шаблону в рядок починаючи з n-ого

Використовуються комбінації /1, /2 і т. д. разом з /g для заміни починаючит з n-го входження шаблону в рядок. Наступна команда замінить "unix" на "linux" починаючи з 3-го входження (перше на друге будуть пропущені)

sed 's/unix/linux/3g' geekfile.txt

Результат:

unix is great os. unix is opensource. linux is free os.
learn operating system.
unix linux which one you choose.
unix is easy to learn.unix is a multiuser os.Learn linux .linux is a powerful.

5. Обгортання перших символів кожного слова дужками

Наступна команда виведе перший символ кожного слова обгорнутий дужками:

echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g'

Результат:

(W)elcome (T)o (T)he (G)eek (S)tuff

6. Заміна шаблону у конкретному рядку

Можна обмежити виконання команди sed потрібним рядком:

sed '3 s/unix/linux/' geekfile.txt

Результат:

unix is great os. unix is opensource. unix is free os.
learn operating system.
linux linux which one you choose.
unix is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.

Вищенаведена команда замінює задане слово лише у третьому рядку.

7. Дублювання змінених рядків

При додаванні прапора /p команда виведе в термінал замінений рядок двічі. Рядки, у яких відсутній шаблон, не дублюються.

sed 's/unix/linux/p' geekfile.txt

Результат:

linux is great os. unix is opensource. unix is free os.
linux is great os. unix is opensource. unix is free os.
learn operating system.
linux linux which one you choose.
linux linux which one you choose.
linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.
linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.

8. Виведення лише змінених рядків

Якщо поруч із прапором /p додати ключ -n, у терміналі з'являться лише рядки, де виконувалась заміна. В даному випадку -n відключає дублюючу поведінку прапора /p, тому рядки із заміною виводяться по одному разу.

sed -n 's/unix/linux/p' geekfile.txt

Результат:

linux is great os. unix is opensource. unix is free os.
linux linux which one you choose.
linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.

Якщо використовувати тільки -n, виключивши /p, на консоль не буде виведено нічого.

9. Заміна шаблону у вказаному діапазоні рядків

sed дозволяє вказувати діапазон рядків, у яких потрібно замінити певний шаблон:

sed '1,3 s/unix/linux/' geekfile.txt

Результат:

linux is great os. unix is opensource. unix is free os.
learn operating system.
linux linux which one you choose.
unix is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.

Тут sed здійснює заміну в рядках з 1 по 3. А ось ще один приклад: sed '2,$ s/unix/linux/' geekfile.txt Результат:

unix is great os. unix is opensource. unix is free os.
learn operating system.
linux linux which one you choose.
linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful

Тут $ вказує на останній рядок файлу, у зв'язку з чим sed замінює входження шаблону, починаючи з другого та до кінця файлу.

10. Видалення рядків із файлу

За допомогою sed також можна видаляти рядки із заданого файлу:

  1. Видалення n-ого рядка:

Синтаксис: sed 'nd' filename.txt

Приклад:

sed '5d' filename.txt
  1. Видалення останнього рядка:

Синтаксис: sed '$d' filename.txt

  1. Видалення рядків з x по y:

Синтаксис: sed 'x,yd' filename.txt

Приклад:

sed '3,6d' filename.txt
  1. Видалення рядків з n-ого :

Синтаксис: sed 'n,$d' filename.txt

Приклад:

sed '12,$d' filename.txt
  1. Видалення тексту, що відповідає шаблону:

Синтаксис: sed '/pattern/d' filename.txt

Приклад:

$ sed '/abc/d' filename.txt

Приклади команд

Далі ми розберемо ще одну серію операцій із командою sed на прикладі іншого файлу, a.txt. Щоб зайве не розтягувати статтю, виведення команд далі не буде, так що для кращого розуміння можете самостійно попрактикуватися, створивши такий же файл з аналогічним вмістом.

[root@rhel7 ~]# cat a.txt
life isn't meant to be easy, life is meant to be lived.
Try to learn & understand something new everyday in life.
Respect everyone & most important love everyone.
Don’t hesitate to ask for love & don’t hesitate to show love too.
Life is too short to be shy.
In life, experience will help you differentiating right from wrong.

Додавання/видалення порожніх рядків у файлі

  1. Вставити після кожного текстового рядка один порожній:
sed G a.txt 
  1. Вставити два порожні рядки:
sed 'G;G' a.txt
  1. Видалити всі порожні рядки та вставити по одному після кожного текстового:
sed '/^$/d;G' a.txt
  1. Вставити порожній рядок над кожним, що містить love:
sed '/love/{x;p;x;}' a.txt
  1. Вставити порожній рядок після кожного, що містить love:
sed '/love/G' a.txt
  1. Вставити 5 пробілів ліворуч від кожного рядка:
sed 's/^/     /' a.txt

Нумерація рядків

  1. Пронумерувати кожен рядок файлу (з лівим вирівнюванням).

У цій команді символ = використовується для нумерації рядка, а прапорець \t для табулювання між номером та реченням:

sed = a.txt | sed 'N;s/\n/\t/'
  1. Пронумерувати кожен рядок файлу (число ліворуч, вирівнювання по правому краю). Ця команда схожа на cat -n filename:
sed = a.txt | sed 'N; s/^/ /; s/ *\(.\{4,\}\)\n/\1 /'
  1. Пронумерувати кожен непустий рядок файлу:
sed '/./=' a.txt | sed '/./N; s/\n/ /'

Видалення рядків

  1. Видалити конкретний рядок:

Синтаксис: sed ‘nd’ filename

Приклад:

sed '5d' a.txt
  1. Видалити останній рядок:

Синтаксис: sed ‘$d’ filename

  1. Видалити рядки з x по y

Синтаксис: sed ‘x,yd’ filename

Приклад:

sed '3,5d' a.txt
  1. Видалити рядки з n-ого до останнього:

Синтаксис: sed ‘n,$d’ filename

Приклад:

sed '2,$d' a.txt
  1. Видалити рядок за шаблоном:

Синтаксис: sed ‘/pattern/d’ filename

Приклад:

sed '/life/d' a.txt
  1. Видалити кожен другий рядок починаючи з n-ого:

Синтаксис: sed ‘n~2d’ filename

Приклад:

sed '3~2d' a.txt
  1. Видалити рядки, що містять шаблон, і по два рядки після них:

Синтаксис: sed ‘/pattern/,+2d’ filename

Приклад:

sed '/easy/,+2d' a.txt
  1. Видалити порожні рядки:
sed '/^$/d' a.txt
  1. Видалити порожні рядки що починаються з #:

Приклад:

sed -i '/^#/d;/^$/d' a.txt

Перегляд/виведення файлів

Для перегляду вмісту файлу ми використовуємо команду cat а його початок та кінець переглядаємо за допомогою утиліт head та tail. А якщо нас цікавить якась ділянка в середині файлу? У такому разі можна знову задіяти sed.

  1. Переглянути файл з рядка x по y:

Синтаксис: sed -n ‘x,yp’ filename

Приклад:

sed -n '2,5p' a.txt
  1. Переглянути весь файл, за винятком заданого діапазону:

Синтаксис: sed ‘x,yd’ filename

Приклад:

sed '2,4d' a.txt
  1. Вивести n-ий рядок файлу:

Синтаксис: sed -n ‘address’p filename

Приклад:

sed -n '4'p a.txt
  1. Вивести рядки з x по* y*:

Синтаксис: sed -n ‘x,y’p filename

Приклад:

sed -n '4,6'p a.txt
  1. Вивести лише останній рядок:

Синтаксис: sed -n ‘$’p filename

  1. Вивести з n-ого рядка до останнього:

Синтаксис: sed -n ‘n,$p’ filename

Приклад:

sed -n '3,$'p a.txt
  1. Вивести рядки, що містять вказаний шаблон:

Синтаксис: sed -n /pattern/p filename

Приклад:

sed -n /every/p a.txt
  1. Вивести рядки починаючи з першого, де виявлено шаблон, і до рядка x:

Синтаксис:sed -n ‘/pattern/,xp’ filename

Приклад:

sed -n '/everyone/,5p' a.txt

У даному випадку перше входження everyone міститься в рядку 3, отже, в терміналі з'являться рядки з 3 по 5. Якщо потрібно вивести файл до кінця, використовуйте замість 5 символ $.

  1. Вивести рядки з x і до рядка, що містить шаблон. Якщо шаблон не знайдено, виводиться файл до кінця:

Синтаксис: sed -n ‘x,/pattern/p’ filename

Приклад:

sed -n '1,/everyone/p' a.txt
  1. Вивести всі рядки, що містять шаблон, включаючи наступні x рядків:

Синтаксис: sed -n ‘/pattern/,+xp’ filename

Приклад:

sed -n '/learn/,+2p' a.txt

Заміна за допомогою команди sed

Нижче наводиться невеликий перелік операцій, що доповнює перелічені раніше.

  1. Два способи заміни шаблону, ігноруючи регістр, використовувати прапор /i:

Синтаксис: sed ‘s/old_pattern/new_pattern/i’ filename

Приклад:

sed 's/life/Love/i' a.txt
  1. Використовувати регулярні вирази:

Приклад:

sed 's/[Ll]ife/Love/g' a.txt
  1. Заміна кількох пробілів одним:

Приклад:

sed 's/  */ /g' filename
  1. Заміна шаблону, що супроводжує інший шаблон:

Синтаксис: sed ‘/followed_pattern/ s/old_pattern/new_pattern/’ filename

Приклад:

sed '/is/ s/live/love/' a.txt
  1. Заміна шаблону іншим шаблоном, крім рядка n:

Синтаксис: sed ‘n!s/old_pattern/new_pattern/’ filename

Приклад:

sed -i '5!s/life/love/' a.txt
Джерело Sed Command in Linux/Unix with examples
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація