Я видел много sed
в последнее время, и я считаю, что это довольно запутанная команда. Страницы man не были особенно полезны, но я знаю, что их можно использовать для анализа вывода других команд.
Что такое sed
и для чего он используется? Я ищу исчерпывающий ответ, охватывающий, что такое sed
, для чего он обычно используется, и некоторые основные примеры / синтаксис.
В основном использовании он используется для «поиска и замены» со строками.
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
, она довольно всеобъемлющая.
sed
- это мощная команда, которая позволяет вам что-то делать (удалять строки, подстановку строк, фильтрацию строк и т. Д.).
Я мог бы дать вам список использований с аргументами, но Интернет заполнен этим. Поиск sed usage by examples
принес мне много результатов, симпатичный: http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substitution-examples/ [ 114]
Определения
Unix System V: практическое руководство , книга Марка Собелла:
Утилита sed - это пакетная программа (неинтерактивный) редактор. Команды sed обычно хранятся в файле сценария. , Хотя вы можете давать простые команды sed из командной строки. , .
blockquote>Справочная страница для sed (GNU sed) 4.2.2:
Sed - это потоковый редактор. Редактор потока используется для выполнения базовых преобразований текста во входном потоке (файле или входе из конвейера).
blockquote>Мое неофициальное определение:
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
Этот ответ является происходящей работой - он пропускает больше примеров о команде susbstitute
sed
?sed
= Потоковый редактор
Описание в странице руководства для GNU sed
4.2.2 отчета:
Sed является потоковым редактором. Потоковый редактор используется для выполнения основных текстовых преобразований на входном потоке (файл или вход от конвейера). В то время как до некоторой степени подобный редактору, который разрешает редактирования в виде сценария (такие как редактор), 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
или a 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