logo

Команда Sed у Linux/Unix із прикладами

Команда 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Інші команди sed
    Також можливі інші способи простої обробки за допомогою приблизно 25 команд sed. Наприклад, нижче використовується параметр d для фільтрації рядків, які містять лише пробіли та символ кінця рядка:
    sed '/^ *$/d' inputFileName
    У наведеному вище прикладі використовуються кілька наведених нижче метасимволів регулярного виразу:
    • Каретка (^) така ж, як початок рядка.
    • Символ долара ($) збігається з завершенням рядка.
    • Зірочка (*) є такою самою, як більше або нуль попередніх символів.
    • Символ плюса (+) збігається з одним або кількома попередніми символами.
    • Знак питання (?) збігається з попереднім символом більше або нуль.
    • Символ крапки (.) точно збігається з одним символом.
    sed як фільтр
    Часто команда sed використовується як фільтр у конвеєрі під Unix:
    $generateData | sed 's/x/y/g'
    Програма generateData генерує дані, а команда sed вносить невеликі зміни, замінюючи x замість y.Файлові сценарії sed
    Часто корисно помістити багато команд 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

Команда sed не обмежується лише керуванням файлами; також ми можемо застосувати його до каталогу STDIN.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

Наведені вище команди замінять перший текст на другий текстовий шаблон. Розглянемо наведений нижче результат:

Фільтр Linux Sed

З наведеного вище результату спочатку ми виконали команду «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' 

Наведені вище команди замінять усі вказані текстові шаблони. Розглянемо наведений нижче результат:

Фільтр Linux Sed

З наведеного вище результату, виконавши команду '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'. Розглянемо наведений нижче результат:

Фільтр Linux Sed

З наведеного вище виводу, виконавши команду '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'. Розглянемо наведений нижче результат:

Фільтр Linux Sed

Як ми бачимо з наведеного вище результату, усі «червоні» слова замінено на «сині», а всі «жовті» слова замінено на «чорні». Ми також можемо розділити команди так:

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

Результат буде таким же, як і в наведеній вище команді.

Читання команд із файлу

Ми можемо зберегти команди sed у файлі та застосувати їх відразу в будь-якому файлі. Це можна зробити, вказавши опцію '-f' наступним чином:

 sed -f 

З наведеної вище команди '' — це файл зі списком команд sed. Розглянемо наведену нижче команду:

 sed -f SedCommands exm.txt 

Наведена вище команда застосує всі вказані команди у файлі «SedCommand» у файлі «exm.txt». Розглянемо наведений нижче результат:

Фільтр Linux Sed

З наведеного вище результату ми використали команди, застосовані до попереднього прикладу. Отже, результат такий самий, як у попередньому прикладі.

Заміна символів

Ми можемо використовувати знак оклику (!) як роздільник рядка. Наприклад, ми хочемо замінити оболонку 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 

Наведена вище команда застосує вказану операцію до третього рядка. Розглянемо наведений нижче результат:

Фільтр Linux Sed

З наведеного вище виводу змінено лише рядок третій.

Ми також можемо вказати діапазон ліній. Щоб вказати діапазон рядків, виконайте команду наступним чином:

 sed '1,3s/Red/Blue/' exm.txt 

Наведена вище команда оновить указаний текст у рядках 1 і 3. Розглянемо наведений нижче результат:

Фільтр Linux Sed

Вставлення та додавання тексту

Прапорці «i» та «a» використовуються для вставки та додавання тексту у файл. Прапорець «i» додасть текст перед рядком, а прапорець «a» використовується для додавання тексту після рядка. Розглянемо наведену нижче команду:

 echo 'Another Demo' | sed 'iFirst Demo' 

Наведена вище команда вставить текст перед текстом «Інша демонстрація». Розглянемо наведений нижче результат:

Фільтр Linux Sed

Щоб додати текст, виконайте команду наступним чином:

 echo 'Another Demo' | sed 'aFirst Demo' 

Наведена вище команда додасть текст. Розглянемо наведений нижче результат:

Фільтр Linux Sed

Модифікація ліній

Прапор 'c' використовується для зміни певного рядка. Щоб змінити рядок, виконайте таку команду:

 sed '3cThis is a modified line.' exm.txt 

Наведена вище команда оновить третій рядок. Розглянемо наведений нижче результат:

Фільтр Linux Sed

Ми також можемо використовувати регулярний вираз, щоб оновити більше одного рядка з однаковим шаблоном. Розглянемо наведену нижче команду:

 sed '/Apple is /c Line updated.' exm.txt 

Наведена вище команда оновить усі рядки з рядком «Apple is». Розглянемо наведений нижче результат:

Фільтр Linux Sed

Трансформація персонажів

Прапор 'y' використовується для трансформації символів. Трансформація символів не може обмежуватися окремими випадками. Щоб трансформувати символи, виконайте команду наступним чином:

 sed 'y/abc/def/' exm.txt 

Наведена вище команда перетворить символи «a», «b», «c» на «d», «e», «f». розгляньте наведений нижче результат:

Фільтр Linux Sed

Друк номерів рядків

Знак «=» використовується для друку номера рядка. Щоб надрукувати номер рядка, виконайте наступну команду:

 sed '=' exm.txt 

Наведена вище команда відобразить номер рядка вмісту файлу. Розглянемо наведений нижче результат:

Фільтр Linux Sed

Знак рівності з опцією '-n' визначає номер рядка, який містить відповідний скрипт. Розглянемо наведений нижче результат:

 sed -n '/mango/=' exm.txt 

Наведена вище команда відобразить номер рядка, який містить слово «манго». Розглянемо наведений нижче результат:

Фільтр Linux Sed

З наведеного вище результату ми бачимо, що рядок номер 2 містить слово «mango».