Что такое sed и для чего он используется?


20

Я видел много в sedпоследнее время, и я считаю, что это довольно запутанная команда. Руководства не были особенно полезны, но я знаю, что их можно использовать для анализа вывода других команд.

Что именно sedи для чего он используется? Я ищу исчерпывающий ответ, охватывающий, что sedесть, для чего он обычно используется, и некоторые основные примеры / синтаксис.


3
Со страницы 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.
руководства

Это должно быть хорошим местом, чтобы начать полный ответ: 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 = 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
  • Печатная линия <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: печатает строки, на которых была произведена замена, еще раз (полезно при использовании вызова -nswitch 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.