sed
sed | |
---|---|
Тип | компьютерная программа, утилита UNIX[вд], stream editor[вд] и сценарный язык |
Разработчик | Ли Макмэхон[вд][1] |
Операционная система | Unix-подобная операционная система |
Первый выпуск | 1974 |
Последняя версия | 4.8 (15 января 2020 года) |
sed (от англ. Stream EDitor) — потоковый текстовый редактор (а также язык программирования), применяющий различные предопределённые текстовые преобразования к последовательному потоку текстовых данных.
Первоначально был написан как
Sed является Тьюринг-полным языком, так как на нём можно создать машину Тьюринга[2][3].
Описание
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 выведет результат на экран.
В
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 развился как естественный преемник популярной команды
sed и awk часто считаются прародителями и вдохновителями языка Perl, и в особенности синтаксиса «s///
» из примера выше.
У языка sed нет переменных, есть только примитив
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 — поиск текста по регулярным выражениям.
Примечания
- ↑ http://sed.sourceforge.net/grabbag/tutorials/sed_mcmahon.txt
- ↑ Implementation of a Turing Machine as Sed Script . Дата обращения: 11 февраля 2005. Архивировано 20 февраля 2018 года.
- ↑ Turing.sed . Дата обращения: 11 февраля 2005. Архивировано 16 января 2018 года.
Ссылки
|
|