Этот ответ находится в стадии разработки - он пропускает больше примеров о команде susbstitute
Что такое sed
?
sed
= Stream EDitor
Описание на странице руководства для sed
отчетов GNU 4.2.2:
Sed - это потоковый редактор. Редактор потока используется для выполнения базовых преобразований текста в потоке ввода (файл или ввод из конвейера). Хотя в некотором смысле он похож на редактор, который разрешает редактирование по сценарию (например, ed), sed работает, выполняя только один проход по входным данным, и, следовательно, более эффективен. Но именно способность sed фильтровать текст в конвейере особенно отличает его от других типов редакторов.
Описание на странице GNU 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
switch in 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.