sed

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

Sed script file[вд]

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

Первоначально был написан как UNIX-утилита Ли Макмэхоном (англ. Lee E. McMahon) из Bell Labs в 1973—74 годах. Сейчас `sed` доступен фактически для любой операционной системы, поддерживающей работу с командной строкой.

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

## Содержание

* 1 Описание
* 2 Таблица соответствия спецсимволов
* 3 См. также
* 4 Примечания
* 5 Ссылки

## Описание

[править | править код]

`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` выведет результат на экран.

В Unix команда `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` возможны до такой степени, что он может быть представлен как высоко специализированный, хотя и простой, язык программирования. Потоком управления, например, можно управлять при помощи метки (двоеточие, за которым следует строка, которая должна быть именем метки) и инструкции ветвления b; инструкция b, за которой следует правильное имя метки, переместит обработку в блок после метки; если метка не существует, тогда ветвление завершит сценарий (скрипт).

`sed` — это одна из наиболее ранних команд Unix, которые позволяли обрабатывать файлы данных из командной строки. `sed` развился как естественный преемник популярной команды grep. Родственный более позднему языку программирования AWK, `sed` позволил применять в shell скриптах мощную и интересную обработку данных, и был одним из первых инструментов Unix, действительно поощрявшим адекватно использовать регулярные выражения.

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

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

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

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

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

ed file
1,$ s/abc/def/

Существует расширенная версия `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 года.

## Ссылки

[править | править код]

* Системное руководство по sed (рус.)
* Неинтерактивный текстовый редактор sed (рус.)
* Документация по sed (рус.)
* Однострочные скрипты sed Архивная копия от 25 августа 2008 на Wayback Machine (рус.)
* Однострочные скрипты sed (англ.)
* Редактирование /etc/network/interfaces в Debian средствами sed Архивная копия от 3 сентября 2008 на Wayback Machine (рус.)
* Просто о sed (рус.)
* Шпаргалка Sed (англ.)
* sed на SourceForge.net (англ.)
* The sed FAQ (англ.)

* sed … потоковый редактор (англ.)
* Super-sed (англ.)
* Спецификация sed в Единой спецификации UNIX на сайте The Open Group (англ.)
* Игра сокобан на sed (англ.)
* Тетрис на sed
* Sed for Windows (англ.)

|

Команды Unix

Утилиты POSIX.1-2008

* admin
* alias
* ar
* asa
* at
* awk
* basename
* batch
* bc
* bg
* c99
* cal
* cat
* cd
* cflow
* chgrp
* chmod
* chown
* cksum
* cmp
* comm
* command
* compress
* cp
* crontab
* csplit
* ctags
* cut
* cxref
* date
* dd
* delta
* df
* diff
* dirname
* du
* echo
* ed
* env
* ex
* expand
* expr
* false
* fc
* fg
* file
* find
* fold
* fort77
* fuser
* gencat
* get
* getconf
* getopts
* grep
* hash
* head
* iconv
* id
* ipcrm
* ipcs
* jobs
* join
* kill
* lex
* link
* ln
* locale
* localedef
* logger
* logname
* lp
* ls
* m4
* mailx
* make
* man
* mesg
* mkdir
* mkfifo
* more
* mv
* newgrp
* nice
* nl
* nm
* nohup
* od
* paste
* patch
* pathchk
* pax
* pr
* printf
* prs
* ps
* pwd
* qalter
* qdel
* qhold
* qmove
* qmsg
* qrerun
* qrls
* qselect
* qsig
* qstat
* qsub
* read
* renice
* rm
* rmdel
* rmdir
* sact
* sccs
* sed
* sh
* sleep
* sort
* split
* strings
* strip
* stty
* tabs
* tail
* talk
* tee
* test
* time
* touch
* tput
* tr
* true
* tsort
* tty
* type
* ulimit
* umask
* unalias
* uname
* uncompress
* unexpand
* unget
* uniq
* unlink
* uucp
* uudecode
* uuencode
* uustat
* uux
* val
* vi
* wait
* wc
* what
* who
* write
* xargs
* yacc
* zcat

GNU Coreutils

Файловые утилиты|

* chgrp
* chown
* chmod
* cp
* dd
* df
* dir
* dircolors
* install
* ln
* ls
* mkdir
* mkfifo
* mknod[англ.]
* mv
* rm
* rmdir
* shred
* sync
* touch
* vdir

Текстовые утилиты|

* cat
* cksum
* comm
* csplit
* cut
* expand
* fmt
* fold
* head
* join
* md5sum
* nl
* od
* paste
* ptx[англ.]
* pr
* sha1sum
* sort
* split
* sum
* tac
* tail
* tr
* tsort[англ.]
* unexpand
* uniq
* wc

Shell-утилиты|

* basename
* chroot
* date
* dirname
* du
* echo
* env
* expr
* factor[англ.]
* false
* groups[англ.]
* hostid
* id
* link
* logname
* nice
* nohup
* pathchk
* pinky
* printenv[англ.]
* printf
* pwd
* readlink
* seq
* sleep
* stat
* stty
* tee
* test
* true
* tty
* uname
* unlink
* users
* who
* whoami
* yes

другие утилиты|

* size
* Start-stop-daemon
* Surfraw

Языки программирования

* История
* Хронология

* 1C
* Ада
* Алгол
* Ассемблер
* APL
* Бейсик
* Си
* C++
* C#
* D
* Delphi
* Кобол
* Erlang
* F#
* Форт
* Фортран
* Go
* Groovy
* Haskell
* Java
* JavaScript
* Julia
* Kotlin
* Лисп
* Lua
* MATLAB
* Оберон
* Objective-C
* OCaml
* Паскаль
* Perl
* PL/SQL
* PHP
* Python
* Racket
* Ruby
* Rust
* Scala
* UNIX Shell
* Smalltalk
* Swift
* Visual Basic .NET
* Zig

Текстовые редакторы

Unix / Linux|

* Ed
* Elvis
* gedit
* Kate
* KWrite
* Leafpad
* Nano
* NEdit
* Sed
* Mousepad
* Vi

DOS|

* ChiWriter
* Multi-Edit
* WordPerfect
* Лексикон
* Микромир
* Слово и Дело
* Фотон

Windows|

* AkelPad
* BirEdit
* Bred
* Crimson Editor
* EditPlus
* EmEditor
* Notepad2
* Notepad++
* Notepad GNU
* PolyEdit
* Programmer’s Notepad
* PSPad
* RJ TextEd
* SoloPad
* SynWrite
* Write
* WinEdt
* WordPad
* Блокнот

Кроссплатформенные|

* Acme
* Atom
* CKeditor
* Emacs
* J
* JEdit
* JOE
* Komodo Edit
* Medit
* SciTE
* Sublime Text
* UltraEdit
* Vim
* Geany
* CudaText
* TEA
* Textadept

SDK|

* Colorer
* Scintilla
* SynEdit

Функции|

* Автодополнение
* Автоформатирование
* Подсветка синтаксиса
* Предиктивный ввод
* Сворачивание
* Отступы