Ця відповідь є незавершеною роботою - вона пропускає більше прикладів про команду 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
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
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
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.