Що таке sed і для чого він використовується?


20

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

Що саме таке sedі для чого це використовується? Я шукаю вичерпну відповідь, що висвітлює, що sedтаке, для чого зазвичай використовується, та деякі основні приклади / синтаксис.


3
З сторінки чоловіка Sed:Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors.
saji89

Це має бути хорошим місцем для початку вичерпної відповіді: en.wikipedia.org/wiki/Sed
saji89

1
info sedмає набагато більше, ніж man sed. Потім, у /usr/share/doc/sed, є sedfaq.txt.gz.

Відповіді:


20

У базовому використанні він використовується для 'пошуку та заміни' рядками.

echo "The quick brown fox jumps over the lazy dog" | sed 's/dog/cat/'

повертає

"The quick brown fox jumps over the lazy cat"

Sed справді світить, коли з ним використовуються регулярні вирази.

Ви хотіли б поглянути на цю статтю про sedїї вельми всеосяжний характер .


5

Визначення

Unix System V: практичний посібник , книга Марка Собелла:

Утиліта sed - це пакетний (неінтерактивний) редактор. Команди sed зазвичай зберігаються у файлі сценарію. . .далі ви можете надати прості команди sed з командного рядка. . .

Основна сторінка для sed (GNU sed) 4.2.2:

Sed - редактор потоків. Редактор потоку використовується для виконання основних перетворень тексту у вхідному потоці (файлі або вхідному трубопроводі).

Моє неофіційне визначення:

Sed(скорочено редактор потоків ) - утиліта для обробки тексту, розроблена в той час, коли текст оброблявся одним рядком, але залишається однією з найпотужніших утиліт Unix / Linux; водночас це форма мови сценаріїв, розроблена спеціально для обробки тексту.

Використання

Як показують визначення, sedвикористовується для пакетної обробки рядків тексту, текстових файлів та трубопроводних потоків тексту. Найчастіше він використовується для заміни, а також видалення тексту:

echo "stackexchange" | sed 's/stackexchange/askubuntu/'

Однак він також може використовуватися для імітації поведінки інших команд. Наприклад,

  • імітувати dmesg | head -n 3(друкуючи перші 3 рядки), ми можемо зробити dmesg | sed -n 1,3p.
  • імітувати dmesg | grep 'wlan0'(шукаючи рядок), ми можемо зробитиdmesg | sed -n '/wlan0/p'
  • Елемент списку

Великою перевагою, що sedмає інші утиліти для обробки тексту, є -iпрапор, тобто ми не можемо просто вивести відредагований текст на екран, а фактично зберегти редагування у вихідний файл. awkНавпаки, аромати мають лише таку особливість у GNU awkверсії.

sedможе приймати дані в командному рядку, з декількома шаблонами, розділеними крапкою з комою ( ;) або з файлом сценарію, вказаним після -fпрапора, наприкладcat someTextfile.txt | sed -f myScript.sed

Застосування та приклади sed


1

sed це потужна команда, яка дозволяє вам робити речі (видаляти рядки, підміна рядків, фільтрація рядків тощо).

Я можу дати вам список застосувань із арґугами, але Інтернет заповнений цим. Пошук sed usage by examplesприніс мені багато результатів, найсимпатичніший: http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substitution-examples/


1

Ця відповідь є незавершеною роботою - вона пропускає більше прикладів про команду susbstitute


Що таке sed?

sed = Редактор потоку

Опис на сторінці керівництва для sedзвітів GNU 4.2.2:

Sed - редактор потоків. Редактор потоків використовується для виконання базових перетворень тексту у вхідному потоці (файл або вхід з конвеєра). Хоча певним чином схожий на редактор, який дозволяє редагувати сценарії (такі як ed), sed працює, роблячи лише один прохід через вхід (и), і, отже, є більш ефективним. Але це здатність sed фільтрувати текст у конвеєрі, що особливо відрізняє його від інших типів редакторів.

Decription в ГНУ sedсторінці в gnu.org звітів:

sed (редактор потоків) не є інтерактивним текстовим редактором. Натомість він використовується для фільтрування тексту, тобто він займає введення тексту, виконує певну операцію (або набір операцій) над ним та виводить модифікований текст. sed, як правило, використовується для вилучення частини файлу з використанням відповідності шаблонів або заміни декількох вхідних рядків у файлі.

Для чого sedвикористовується?

Він може бути використаний для виконання складних модифікацій потоків даних (зазвичай текст, але він також може бути використаний і для зміни бінарних даних).

Серед найбільш поширених випадків використання є:

  • Вибірковий друк / видалення рядків з текстового файлу з використанням основних / розширених регулярних виразів
  • Глобально замінюючи рядки в текстовому файлі, використовуючи основні / розширені регулярні вирази
  • Вибіркова заміна рядків у текстовому файлі з використанням основних / розширених регулярних виразів

Це випадки використання, висвітлені у цій відповіді.

Використання

sedзчитує вхід з файлу, що зберігається у файловій системі, якщо ім'я файлу вказано в аргументах командного рядка під час його виклику або з того, stdinякщо ім’я файлу не вказано.

Мінімальний виклик за допомогою файлу, що зберігається у файловій системі:

sed '' file

Мінімальне виклик за допомогою stdin:

# herestring
<<<'Hello, World!' sed ''

# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF

# file
<'file' sed ''

# pipe
echo 'Hello, World!' | sed ''

Привіт Світ!

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

Якщо жодна команда не вказана або коли вказана команда a pабо d* *, sedзавжди буде надруковано поточний вміст простору шаблону з наступним новим рядком при кожній ітерації незалежно від:

user@debian ~ % sed '' file
Hello, world! # no command but the lines are printed
user@debian ~ % sed 'p' file
Hello, World!
Hello, World! # the p command prints the lines already printed
user@debian ~ % sed 'd' file
user@debian ~ % # the d command deletes the lines that would be printed

Щоб запобігти цьому, можна викликати sedразом з -nкомутатором:

user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ % 

* Говорячи тільки для p, dі sкоманд, які є командами , описаними в цій відповіді.

Вибір ліній

sedможе обробляти весь вхідний файл або обробляти лише вибрані рядки вхідного файлу; виділення рядків вхідного файлу, який обробляється, здійснюється шляхом вказівки "адреси"; адреса може (серед іншого) бути номером рядка або шаблоном; діапазони ліній можуть бути вибрані, вказавши діапазони адрес.

Можливі комбінації адрес:

  • <N>(де <N>число): наступні команди / команди будуть виконуватись лише за номером рядка <N>;
  • <N>,<M>(де <N>і <M>є два числа, <N>> <M>): наступні команди / команди будуть виконуватися на рядках, починаючи з номера <N>рядка до <M>включно номера рядка ;
  • /<pattern>/(де <pattern>є основним або розширеним регулярним виразом): наступні команди / команди будуть виконуватися лише на рядках, що містять виникнення <pattern>;
  • /<pattern1>/,/<pattern2>/(Де <pattern1>і <pattern2>є основними або розширеним регулярними виразами): наступна команда / команди будуть виконані на лініях , починаючи з першим рядком , що містить входження <pattern1>в наступний рядок , що містить входження <pattern2>, кілька разів в разі множинного замовили <pattern1>- <pattern2>входження;
  • <N>,/pattern/(де <N>є число і <pattern>є основним або розширеним регулярним виразом): наступні команди / команди будуть виконуватися на рядках, починаючи від номера рядка <N>до першого рядка, що містить виникнення <pattern>;
  • /pattern/,<N>(де <pattern>є основним або розширеним регулярним виразом і <N>є числом): наступні команди / команди будуть виконуватись на рядках, починаючи з першого рядка, що містить виникнення <pattern>до номера рядка <N>;

Вибір, здійснений для друку, видалення або виконання заміни на діапазонах рядків, завжди буде включати рядки, що відповідають вказаним адресам; крім того, вибір, який виконується для друку, видалення або виконання підстановок на діапазонах ліній, використовуючи шаблони, є лінивим і глобальним (тобто кожен порушений діапазон завжди буде найменшим, наскільки це можливо, і впливатиме кілька діапазонів).

Під час друку діапазонів рядків або друку тільки рядків, на яких здійснена заміна, необхідно посилатися sedразом із -nкомутатором, щоб уникнути друку ліній, що відповідають критерію, щоб надрукуватись двічі (це відбувається лише під час друку діапазонів рядків) та в порядку щоб рядки не відповідали критерію для друку незалежно.

Вибір рядків, що підлягають обробці, повинен супроводжуватися командою або кількома командами, розділеними крапкою з комою, згрупованими за допомогою дужок.

Команди: друкувати, видаляти

Команди, які використовуються для друку або видалення виділення, є відповідно:

  • p: друкує рядки, що відповідають вказаній адресі / діапазону адрес;
  • d: видаляє рядки, що відповідають вказаній адресі / діапазону адрес;

Коли одній з цих команд не передує адреса / виділення, команда виконується глобально, тобто в кожному рядку вхідного файлу.

Приклади: друкувати, видаляти

Друк / видалення рядків із зазначенням числових адрес:

Зразок файлу:

line1
line2
line3
line4
line5
  • Лінія друку <N>:
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
  • Видалення рядка <N>:
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
  • Друк лінії <N>до <M>включно:
sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
  • Видалення рядка <N>з <M>урахуванням:
sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5

Друк / видалення ліній із зазначенням шаблонів:

Зразок файлу:

First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
  • Друковані лінії, що відповідають <pattern>:
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
  • Видалення відповідних рядків <pattern>:
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file 
First line
Random line
Random line
Random line
Last line
  • Друк ліній з відповідності рядків <pattern1>до збігу ліній <pattern2>включно:
sed -n '/<pattern1>/,/<pattern2>/p' file
user@debian ~ % sed -n '/Start/,/Stop/p' file
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
  • Видалення рядків із відповідності рядка <pattern1>до збігу рядків <pattern2>включно:
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file 
First line
Last line

Команда: заміна

Команда, яка використовується для заміни на вибір, є:

  • s: рядки-замінники, що відповідають вказаній адресі / діапазону адрес;

Коли цій команді не передує адреса / виділення, команда виконується глобально, тобто в кожному рядку вхідного файлу.

Синтаксис sкоманди:

s/<pattern>/<replacement_string>/<pattern_flags>

Штрихи - «роздільники»; вони використовуються для поділу <pattern>, <replacement_string>і <pattern_flags>секції;

Розмежувачем завжди є символ, що безпосередньо слідує за sкомандою; його можна встановити на будь-який інший символ, наприклад |:

s|<pattern>|<replacement_string>|<pattern_flags>

<pattern>є основним або розширеним регулярним виразом; <replacement_string>- це фіксований рядок, який може містити sedспецифічні послідовності зі спеціальним значенням; <pattern_flags>- це список прапорів, які змінюють поведінку <pattern>.

Найбільш поширені sedспецифічні послідовності з особливим значенням:

  • &: зворотний зв'язок замінено на рядок, відповідний <pattern>;
  • \<N>(де <N>число): зворотний зв'язок замінено на <N>групу, захоплену в <pattern>;

Найпоширеніші прапори:

  • g: сили, <pattern>щоб збігатися глобально, тобто кілька разів у кожному рядку;
  • i: сили, <pattern>щоб відповідати випадку нечутливого;
  • p: друкує рядки, на яких була здійснена підміна вкотре (корисно при використанні -nперемикача у sedвиклику для друку тільки рядків, на яких здійснена заміна);

Приклади: заміна

Зразок файлу:

A-well-a everybody's heard about the bird
B-b-b-bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, the bird is the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a don't you know about the bird?
Well, everybody knows that the bird is the word!
A-well-a bird, bird, b-bird's the word
A-well-a...
  • Заміна першого входження <pattern>з <replacement_string>в кожному рядку:
sed 's/<pattern>/<replacement_string>/' file
user@debian ~ % sed 's/bird/birds/' file
A-well-a everybody's heard about the birds
B-b-b-birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, the bird is the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, bird, b-bird's the word
  • Заміна всіх входжень <pattern>з <replacement_string>кожним рядком:
sed 's/<pattern>/<replacement_string>/g' file
user@debian ~ % sed 's/bird/birds/g' file
A-well-a everybody's heard about the birds
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, birds, b-birds's the word
A-well-a...
  • Вибір за виключенням окремих виразів , що починаються з <pattern1>і замінюють всіх входжень <pattern2>з <replacement_string>:
sed -n '/^<pattern1>/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/^A/s/bird/birds/pg' file
A-well-a everybody's heard about the birds
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
A-well-a birds, birds, b-birds's the word
  • Вибір лише рядків, що закінчуються <pattern1>та заміни всіх випадків <pattern2>на <replacement_string>:
sed -n '/<pattern1>$/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/word$/s/bird/birds/pg' file
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, b-birds's the word
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.