Команда Linux 'sed' означає редактор потоків. Використовується для редагування потоків (файлів) за допомогою регулярних виразів. Але це редагування не є постійним. Він залишається лише на дисплеї, але фактично вміст файлу залишається незмінним.
В першу чергу він використовується для підстановки тексту; крім того, його можна використовувати для інших операцій маніпулювання текстом, таких як вставка, видалення, пошук тощо. Команда sed дозволяє редагувати файли, не відкриваючи їх. Підтримка регулярних виразів робить його більш потужним інструментом для роботи з текстом.
Огляд команди sed
Це утиліта Unix, яка перетворює та аналізує текст за допомогою компактної та простої мови програмування. Він був інтегрований з 1973 по 1974 роки Лі Е. Макмехоном з Bell Labs і сьогодні присутній майже в кожній операційній системі. Команда sed базувалася на аспектах сценаріїв попередньої версії qed (швидкого редактора) та інтерактивного редактора ed. Це був найперший інструмент для підтримки регулярних виразів і залишається активним для обробки тексту, особливо з командою підстановки. Відомі альтернативні інструменти включають Perl і AWK для 'редагування потоку' і маніпуляції рядками відкритого тексту.
Режим роботи команди sed
Команда sed — це рядкова утиліта обробки тексту: вона рядково зчитує текст із файлу або вхідного потоку у внутрішній буфер, відомий як простір шаблонів. Усі зчитування рядків починають цикл. Команда sed використовує одну або кілька операцій, які були описані сценарієм sed у просторі шаблону. Він працює мовою програмування, використовуючи близько 25 команд, які описують операції над текстом.
Для всіх вхідних рядків команда sed зазвичай створює простір шаблону та знову починає цикл із наступного рядка після виконання сценарію. Інші характери кінця сценарію доступні в командах сценарію та встановлюють параметри, наприклад, N для негайного включення наступного рядка в простір шаблону, q для виходу, d для видалення простору шаблону тощо. Таким чином, сценарій sed відноситься до тіла циклу, який виконує ітерацію з потоку, в якому змінна циклу та сам цикл підтримуються та неявно sed.
- Сценарій sed можна або описати в командному рядку, або прочитати через ізольований файл. У сценарії sed команди можуть приймати додаткову адресу в контексті регулярних виразів або номерів рядків. Адреса визначає час виконання команди. Наприклад, 2d виконає лише команду d (або видалення) у другому рядку введення, тоді як /^ /d видалить усі рядки, що починаються з пробілу.
- Простір утримання, ізольований спеціальний буфер, може використовуватися деякими командами sed для зберігання накопичувального тексту між циклами. Командна мова sed має лише дві змінні (простір шаблону та простір утримання) і функціонал розгалуження, схожий на GOTO. Однак мова є повною за Тьюрингом. Езотеричні сценарії sed доступні для кількох ігор, таких як тетріс, шахи, арканоїд і сокобан.
- Основний цикл виконується для всіх рядків вхідного потоку, перевіряючи сценарій sed у всіх рядках вхідних даних. Усі рядки сценарію sed являють собою пару шаблон-дія, яка представляє, який шаблон для відповідності та яку дію реалізувати, яку можна скопіювати як умовний оператор. Дії за замовчуванням (друк простору шаблону, копіювання рядка в простір шаблону), вхідні та вихідні потоки та робочі змінні (простір утримання та простір шаблону) неявні; можна вказати стислі однорядкові програми через основний цикл.
Використання команди sed
- Каретка (^) така ж, як початок рядка.
- Символ долара ($) збігається з завершенням рядка.
- Зірочка (*) є такою самою, як більше або нуль попередніх символів.
- Символ плюса (+) збігається з одним або кількома попередніми символами.
- Знак питання (?) збігається з попереднім символом більше або нуль.
- Символ крапки (.) точно збігається з одним символом.
Наведений нижче приклад представляє найбільш командне та типове використання команди sed, тобто заміну. Використання було фактичною мотивацією для команди sed:
sed 's/regexp/replacement/g' inputFileName > outputFileName
Також можливі інші способи простої обробки за допомогою приблизно 25 команд sed. Наприклад, нижче використовується параметр d для фільтрації рядків, які містять лише пробіли та символ кінця рядка:
sed '/^ *$/d' inputFileName
У наведеному вище прикладі використовуються кілька наведених нижче метасимволів регулярного виразу:
Часто команда sed використовується як фільтр у конвеєрі під Unix:
$generateData | sed 's/x/y/g'
Програма generateData генерує дані, а команда sed вносить невеликі зміни, замінюючи x замість y.
Часто корисно помістити багато команд sed, по одній команді на кожен рядок, у файл сценарію та використовувати прапорець -f для виконання команд із файлу:
sed -f subst.sed inputFileName > outputFileName
Синтаксис:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
Опції:
Нижче наведено деякі параметри командного рядка команди sed:
-n, --quiet, --silent: Це дозволяє нам надрукувати простір шаблону.
-e скрипт, --expression=script: Він використовується для додавання сценарію до команд, які потрібно виконати.
-f файл сценарію, --file=файл сценарію: Він використовується для додавання вмісту файлу сценарію до команд, які потрібно виконати.
--follow-symlinks: він використовується для переходу за символічними посиланнями під час обробки на місці.
-i[СУФІКС], --in-place[=СУФІКС]: він використовується для редагування файлів на місці (створює резервну копію, якщо надається параметр SUFFIX).
модель будівельника
-l N, --line-length=N: Він використовується для визначення бажаної довжини переносу рядка для команди l.
--posix: він використовується для вимкнення всіх розширень GNU.
-E, -r, --regexp-extended: Це дозволяє нам використовувати розширені регулярні вирази в сценарії (для переносимості використовуйте POSIX -E).
-s, --separe: він використовується для розгляду файлів як окремих, а не як одного, і продовжує довгий потік.
--пісочниця: Використовується для роботи в режимі пісочниці.
-u, --небуферизований: Він використовується для завантаження мінімальних обсягів даних із вхідних файлів і частіше очищає вихідні буфери.
-z, --нульові дані: Він використовується для розділення рядків символами NUL.
--довідка: він використовується для відображення довідкового посібника.
--версія: Він використовується для відображення інформації про версію.
Приклади команди sed
Давайте розглянемо наступні приклади:
- Застосування до каталогу STDIN
- Глобальна заміна
- Видалення лінії
- Використання команди Multiple sed
- Читання команд із файлу
- Заміна символів
- Обмеження сед
- Вставлення та додавання тексту
- Модифікація ліній
- Трансформація персонажів
- Друк номерів рядків
Застосування до каталогу STDIN
Команда sed не обмежується лише керуванням файлами; також ми можемо застосувати його до каталогу STDIN.
echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/'
Наведені вище команди замінять перший текст на другий текстовий шаблон. Розглянемо наведений нижче результат:
З наведеного вище результату спочатку ми виконали команду «sed» для рядка «class7», де «class» змінено на «jtp», а 7 — на 10. Потім ми виконали команду «sed» для потоку «msg.txt». ', де 'learn' перетворюється на 'study'.
Глобальна заміна
У попередньому прикладі всі слова «learn» не були відредаговані на «study». Щоб редагувати кожне слово, ми повинні використовувати глобальну заміну «g». Він відредагує всі вказані слова у файлі чи рядку.
Синтаксис:
command | sed 's///g'
Розглянемо наведені нижче приклади.
echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g'
Наведені вище команди замінять усі вказані текстові шаблони. Розглянемо наведений нижче результат:
З наведеного вище результату, виконавши команду 'echo class7 class9 | sed 's/class/jtp/g'' весь 'class' перетворюється на 'jtp' і за допомогою команди 'cat msg.txt | sed 's/learn/study/g'' весь 'learn' було перетворено на 'study'.
Видалення лінії
Параметр «d» дозволить нам видалити повний рядок із файлу. Нам потрібно лише вказати слово з цього рядка з опцією «d», і цей рядок буде видалено. Але зауважте, що всі рядки, які містять те саме слово, будуть видалені. Він буде виконуватися як:
cat | sed '//d'
Розглянемо наведену нижче команду:
cat msg.txt | sed '/jtp/d'
Наведена вище команда видалить рядки зі словом 'jtp'. Розглянемо наведений нижче результат:
З наведеного вище виводу, виконавши команду 'cat msg.txt | sed '/jtp/d'' всі рядки, що містять слово 'jtp' видаляються.
Використання команди Multiple sed
Параметр '-e' дозволяє нам виконувати декілька команд sed одночасно. Ми можемо виконати більше ніж одну операцію sed, виконавши таку команду:
sed -e ' ; '
Розглянемо наведену нижче команду:
sed -e 's/red/blue/; s/yellow/black/' exm.txt
Наведена вище команда застосує всі вказані операції у файлі 'exm.txt'. Розглянемо наведений нижче результат:
Як ми бачимо з наведеного вище результату, усі «червоні» слова замінено на «сині», а всі «жовті» слова замінено на «чорні». Ми також можемо розділити команди так:
sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt
Результат буде таким же, як і в наведеній вище команді.
Читання команд із файлу
Ми можемо зберегти команди sed у файлі та застосувати їх відразу в будь-якому файлі. Це можна зробити, вказавши опцію '-f' наступним чином:
sed -f
З наведеної вище команди '' — це файл зі списком команд sed. Розглянемо наведену нижче команду:
sed -f SedCommands exm.txt
Наведена вище команда застосує всі вказані команди у файлі «SedCommand» у файлі «exm.txt». Розглянемо наведений нижче результат:
З наведеного вище результату ми використали команди, застосовані до попереднього прикладу. Отже, результат такий самий, як у попередньому прикладі.
Заміна символів
Ми можемо використовувати знак оклику (!) як роздільник рядка. Наприклад, ми хочемо замінити оболонку bash на оболонку csh у '/etc/passwd'. Для цього виконайте наведену нижче команду:
sed 's//bin/bash//bin/csh/' /etc/passwd
Ми можемо досягти такого ж результату, виконавши наведену нижче команду:
sed 's!/bin/bash!/bin/csh!' /etc/passwd
Обмеження сед
Основне використання команди sed обробляє весь файл. Але ми можемо обмежити команду sed і вказати будь-який рядок. Є два способи обмежити команду sed:
- Асортимент ліній.
- Шаблон, який відповідає певній лінії.
Ми можемо надати номер для визначення рядка таким чином:
sed '3s/Red/Blue/' exm.txt
Наведена вище команда застосує вказану операцію до третього рядка. Розглянемо наведений нижче результат:
З наведеного вище виводу змінено лише рядок третій.
Ми також можемо вказати діапазон ліній. Щоб вказати діапазон рядків, виконайте команду наступним чином:
sed '1,3s/Red/Blue/' exm.txt
Наведена вище команда оновить указаний текст у рядках 1 і 3. Розглянемо наведений нижче результат:
Вставлення та додавання тексту
Прапорці «i» та «a» використовуються для вставки та додавання тексту у файл. Прапорець «i» додасть текст перед рядком, а прапорець «a» використовується для додавання тексту після рядка. Розглянемо наведену нижче команду:
echo 'Another Demo' | sed 'iFirst Demo'
Наведена вище команда вставить текст перед текстом «Інша демонстрація». Розглянемо наведений нижче результат:
Щоб додати текст, виконайте команду наступним чином:
echo 'Another Demo' | sed 'aFirst Demo'
Наведена вище команда додасть текст. Розглянемо наведений нижче результат:
Модифікація ліній
Прапор 'c' використовується для зміни певного рядка. Щоб змінити рядок, виконайте таку команду:
sed '3cThis is a modified line.' exm.txt
Наведена вище команда оновить третій рядок. Розглянемо наведений нижче результат:
Ми також можемо використовувати регулярний вираз, щоб оновити більше одного рядка з однаковим шаблоном. Розглянемо наведену нижче команду:
sed '/Apple is /c Line updated.' exm.txt
Наведена вище команда оновить усі рядки з рядком «Apple is». Розглянемо наведений нижче результат:
Трансформація персонажів
Прапор 'y' використовується для трансформації символів. Трансформація символів не може обмежуватися окремими випадками. Щоб трансформувати символи, виконайте команду наступним чином:
sed 'y/abc/def/' exm.txt
Наведена вище команда перетворить символи «a», «b», «c» на «d», «e», «f». розгляньте наведений нижче результат:
Друк номерів рядків
Знак «=» використовується для друку номера рядка. Щоб надрукувати номер рядка, виконайте наступну команду:
sed '=' exm.txt
Наведена вище команда відобразить номер рядка вмісту файлу. Розглянемо наведений нижче результат:
Знак рівності з опцією '-n' визначає номер рядка, який містить відповідний скрипт. Розглянемо наведений нижче результат:
sed -n '/mango/=' exm.txt
Наведена вище команда відобразить номер рядка, який містить слово «манго». Розглянемо наведений нижче результат:
З наведеного вище результату ми бачимо, що рядок номер 2 містить слово «mango».