sed

Материал из Википедии — свободной энциклопедии

sed
Тип компьютерная программа, утилита UNIX[вд], stream editor[вд] и сценарный язык
Разработчик Ли Макмэхон[вд][1]
Операционная система Unix-подобная операционная система
Первый выпуск 1974
Последняя версия 4.8 (15 января 2020 года)

sed (от англ. Stream EDitor) — потоковый текстовый редактор (а также язык программирования), применяющий различные предопределённые текстовые преобразования к последовательному потоку текстовых данных.

Первоначально был написан как

командной строкой
.

Sed является Тьюринг-полным языком, так как на нём можно создать машину Тьюринга[2][3].

Описание

sed получает входной поток (обычно файл) построчно, редактирует каждую строку согласно правилам, определённым в sed-

скрипте
с использованием простого языка sed, и затем выводит результат в выходной поток.

sed часто называют неинтерактивным текстовым редактором. Он отличается от обычных текстовых редакторов «инвертированностью» по отношению к тексту и набору команд редактирования. Обычные текстовые редакторы вначале загружают весь текст документа, а затем применяют к нему команды по одной, в то время как sed вначале загружает в себя набор команд, а затем применяет весь набор команд к каждой строке текста. Так как одновременно в памяти находится только одна строка, sed может обработать произвольно большие текстовые файлы.

Набор команд sed сделан по образцу редактора ed, однако необходимо помнить о его инвертированности. Например, команда 25d редактора ed означает «идите к строке 25 и удалите её», в то время как та же команда sed означает «если это строка с номером 25, то удалите (не выводите) её». Известное исключение — это команды копирования и перемещения, которые охватывают диапазон строк и таким образом не имеют прямых эквивалентов в sed. Вместо этого sed вводит дополнительный буфер, названный «пространством захвата», и дополнительные команды для управления им. Например, команда «скопировать строку 25 в строку 76» (25t76) в ed была бы закодирована как две отдельные команды (25h; 76g) в sed для того, чтобы сохранить строку в пространстве захвата до тех пор, пока данные не будут извлечены.

Следующий пример демонстрирует типичное использование sed:

 sed -e 's/oldstuff/newstuff/g' inputFileName > outputFileName

Здесь s — замена; g — глобально, что означает «все вхождения искомого значения». После первого прямого

регулярное выражение для поиска, после второго — выражение для замены. Однако, помимо слеша
может использоваться и другой символ. Так, например, выражения

echo 123123| sed 's/1/5/g'
echo 123123| sed 's%1%5%g'
echo 123123| sed 's$1$5$g'
echo 123123| sed 's|1|5|g'

полностью равнозначны.

Команда замены (s///) является самой мощной и часто используемой командой sed. Перенаправление стандартного вывода «> outputFileName» можно опустить, тогда sed выведет результат на экран.

В

конвейере
(| или pipe):

 generate_data | sed -e 's/x/y/'

Таким образом генерируются данные и передаются на конвейер, чтобы заменить x на y.

Несколько команд могут быть объединены в одном файле (например, subst.sed) и затем применены в виде:

 sed -f subst.sed inputFileName > outputFileName

Или можно написать файла скрипта, используя шебанг. Например, создав исполняемый файл subst.sed с содержимым:

#!/bin/sed -f
s/x/y/g

Его можно выполнять непосредственно:

subst.sed inputFileName > outputFileName

Помимо замены, возможны и другие формы простой обработки. Например, следующий сценарий удаляет пустые строки или строки, которые содержат только пробелы:

 sed -e '/^\s*$/d' inputFileName

Последний пример использовал часть регулярных выражений-метасимволов:

  • ^ Соответствует началу строки
  • $ Соответствует концу строки
  • . Соответствует любому единственному символу
  • * Соответствует нулю или более повторений предшествующего символа
  • [ ] Соответствуют одному любому из символов, включённых в квадратные скобки между [ и ]
  • [^ ] Соответствуют одному любому из символов, не включённых в квадратные скобки между [^ и ]
  • \буква соответствуют одному любому символу из определённого класса символов, в частности \s — это любой пробельный символ.

Комплексные конструкции sed возможны до такой степени, что он может быть представлен как высоко специализированный, хотя и простой,

скрипт
).

sed — это одна из наиболее ранних команд Unix, которые позволяли обрабатывать файлы данных из командной строки. sed развился как естественный преемник популярной команды

скриптах
мощную и интересную обработку данных, и был одним из первых инструментов Unix, действительно поощрявшим адекватно использовать регулярные выражения.

sed и awk часто считаются прародителями и вдохновителями языка Perl, и в особенности синтаксиса «s///» из примера выше.

У языка sed нет переменных, есть только примитив

GOTO и выполняющие ветвление функциональные возможности; тем не менее это тьюринг-полный
язык.

GNU sed имеет несколько новых особенностей, например замещающая правка файлов (замена первоначального файла результатом работы sed). Замещающая правка часто используется вместо сценария ed, например

 sed -i 's/abc/def/' file

может использоваться вместо

 ed file
 1,$ s/abc/def/
 w
 q

Существует расширенная версия sed, называемая Super-sed (ssed), которая включает регулярные выражения, совместимые с Perl.

Таблица соответствия спецсимволов

Использование HEX-16 позволяет вставлять спецсимволы

Символ в ASCII Соответствие в HEX-16
" \x22
' \x27
, \x2C
$ \x24
! \x21
; \x3B
` \x60
| \x7C

Пример использования:

Требуется: заменить"hello" на "hello world"

sed 's/\x22hello\x22\x2C/\x22hello world\x22\x2C/g'

Часть символов в HEX-16 продолжает восприниматься как регулярные выражения и требует экранирования.

Пример:

Требуется: заменить $config['default_host'] = ''; на $config['default_host'] = 'localhost';

sed -i 's/\x24config\[\x27default_host\x27\] = \x27\x27\x3B/\x24config\[\x27default_host\x27\] = \x27localhost\x27\x3B/g' /etc/roundcube/config.inc.php

См. также

  • grep — поиск текста по регулярным выражениям.

Примечания

  1. http://sed.sourceforge.net/grabbag/tutorials/sed_mcmahon.txt
  2. Implementation of a Turing Machine as Sed Script. Дата обращения: 11 февраля 2005. Архивировано 20 февраля 2018 года.
  3. Turing.sed. Дата обращения: 11 февраля 2005. Архивировано 16 января 2018 года.

Ссылки