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
також можна видаляти рядки із заданого файлу:
- Видалення n-ого рядка:
Синтаксис:
sed 'nd' filename.txt
Приклад:
sed '5d' filename.txt
- Видалення останнього рядка:
Синтаксис: sed '$d' filename.txt
- Видалення рядків з x по y:
Синтаксис:
sed 'x,yd' filename.txt
Приклад:
sed '3,6d' filename.txt
- Видалення рядків з n-ого :
Синтаксис:
sed 'n,$d' filename.txt
Приклад:
sed '12,$d' filename.txt
- Видалення тексту, що відповідає шаблону:
Синтаксис:
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.
Додавання/видалення порожніх рядків у файлі
- Вставити після кожного текстового рядка один порожній:
sed G a.txt
- Вставити два порожні рядки:
sed 'G;G' a.txt
- Видалити всі порожні рядки та вставити по одному після кожного текстового:
sed '/^$/d;G' a.txt
- Вставити порожній рядок над кожним, що містить love:
sed '/love/{x;p;x;}' a.txt
- Вставити порожній рядок після кожного, що містить love:
sed '/love/G' a.txt
- Вставити 5 пробілів ліворуч від кожного рядка:
sed 's/^/ /' a.txt
Нумерація рядків
- Пронумерувати кожен рядок файлу (з лівим вирівнюванням).
У цій команді символ = використовується для нумерації рядка, а прапорець \t
для табулювання між номером та реченням:
sed = a.txt | sed 'N;s/\n/\t/'
- Пронумерувати кожен рядок файлу (число ліворуч, вирівнювання по правому краю).
Ця команда схожа на
cat -n filename
:
sed = a.txt | sed 'N; s/^/ /; s/ *\(.\{4,\}\)\n/\1 /'
- Пронумерувати кожен непустий рядок файлу:
sed '/./=' a.txt | sed '/./N; s/\n/ /'
Видалення рядків
- Видалити конкретний рядок:
Синтаксис:
sed ‘nd’ filename
Приклад:
sed '5d' a.txt
- Видалити останній рядок:
Синтаксис: sed ‘$d’ filename
- Видалити рядки з x по y
Синтаксис: sed ‘x,yd’ filename
Приклад:
sed '3,5d' a.txt
- Видалити рядки з n-ого до останнього:
Синтаксис: sed ‘n,$d’ filename
Приклад:
sed '2,$d' a.txt
- Видалити рядок за шаблоном:
Синтаксис: sed ‘/pattern/d’ filename
Приклад:
sed '/life/d' a.txt
- Видалити кожен другий рядок починаючи з n-ого:
Синтаксис: sed ‘n~2d’ filename
Приклад:
sed '3~2d' a.txt
- Видалити рядки, що містять шаблон, і по два рядки після них:
Синтаксис: sed ‘/pattern/,+2d’ filename
Приклад:
sed '/easy/,+2d' a.txt
- Видалити порожні рядки:
sed '/^$/d' a.txt
- Видалити порожні рядки що починаються з #:
Приклад:
sed -i '/^#/d;/^$/d' a.txt
Перегляд/виведення файлів
Для перегляду вмісту файлу ми використовуємо команду cat
а його початок та кінець переглядаємо за допомогою утиліт head
та tail
. А якщо нас цікавить якась ділянка в середині файлу? У такому разі можна знову задіяти sed
.
- Переглянути файл з рядка x по y:
Синтаксис: sed -n ‘x,yp’ filename
Приклад:
sed -n '2,5p' a.txt
- Переглянути весь файл, за винятком заданого діапазону:
Синтаксис: sed ‘x,yd’ filename
Приклад:
sed '2,4d' a.txt
- Вивести n-ий рядок файлу:
Синтаксис: sed -n ‘address’p filename
Приклад:
sed -n '4'p a.txt
- Вивести рядки з x по* y*:
Синтаксис: sed -n ‘x,y’p filename
Приклад:
sed -n '4,6'p a.txt
- Вивести лише останній рядок:
Синтаксис: sed -n ‘$’p filename
- Вивести з n-ого рядка до останнього:
Синтаксис: sed -n ‘n,$p’ filename
Приклад:
sed -n '3,$'p a.txt
- Вивести рядки, що містять вказаний шаблон:
Синтаксис: sed -n /pattern/p filename
Приклад:
sed -n /every/p a.txt
- Вивести рядки починаючи з першого, де виявлено шаблон, і до рядка x:
Синтаксис:sed -n ‘/pattern/,xp’ filename
Приклад:
sed -n '/everyone/,5p' a.txt
У даному випадку перше входження everyone міститься в рядку 3, отже, в терміналі з'являться рядки з 3 по 5. Якщо потрібно вивести файл до кінця, використовуйте замість 5 символ $.
- Вивести рядки з x і до рядка, що містить шаблон. Якщо шаблон не знайдено, виводиться файл до кінця:
Синтаксис: sed -n ‘x,/pattern/p’ filename
Приклад:
sed -n '1,/everyone/p' a.txt
- Вивести всі рядки, що містять шаблон, включаючи наступні x рядків:
Синтаксис: sed -n ‘/pattern/,+xp’ filename
Приклад:
sed -n '/learn/,+2p' a.txt
Заміна за допомогою команди sed
Нижче наводиться невеликий перелік операцій, що доповнює перелічені раніше.
- Два способи заміни шаблону, ігноруючи регістр, використовувати прапор
/i
:
Синтаксис: sed ‘s/old_pattern/new_pattern/i’ filename
Приклад:
sed 's/life/Love/i' a.txt
- Використовувати регулярні вирази:
Приклад:
sed 's/[Ll]ife/Love/g' a.txt
- Заміна кількох пробілів одним:
Приклад:
sed 's/ */ /g' filename
- Заміна шаблону, що супроводжує інший шаблон:
Синтаксис: sed ‘/followed_pattern/ s/old_pattern/new_pattern/’ filename
Приклад:
sed '/is/ s/live/love/' a.txt
- Заміна шаблону іншим шаблоном, крім рядка n:
Синтаксис: sed ‘n!s/old_pattern/new_pattern/’ filename
Приклад:
sed -i '5!s/life/love/' a.txt
Джерело Sed Command in Linux/Unix with examples
Ще немає коментарів