Разница между 1.14
и текущей версией
ЯзыкSed.
@@ -1,18 +1,51 @@
-- Потоковый редактор sed
+= Потоковый редактор sed
-Один из долгожителей мира Unix, к сожалению позабытый инструмент эффективного решения множества задач, связанных с обработкой текста.
+Один из долгожителей мира Unix, к сожалению позабытый инструмент эффективного решения множества задач, связанных с обработкой текста. По утверждению авторов языка ''sed'', разработанного в 1978 году как расширение редактора ''ed'', новый редактор предназначался для трёх специфичных случаев:
--- Основы языка
+ 1 Работа с большими по объёму файлами, редактирование которых в интерактивном режиме неудобно.
+ 1 Редактирование файлов любого размера в том случае, если последовательность команд редактирования неудобна для интерактивного ввода.
+ 1 Выполнение множества команд редактирования эффективно за один проход (критично для организации конвеера).
+
+Утилита ''sed'' входит в состав дистрибутивов Unix; стандарт поведения и языка специфицированы IEEE Std 1003.1, а также во включающим его ''''''SUSv4''''''.
+
+- Основы языка
+
+Приблизительно ''sed'' выполняет следующие действия:
+
+ foreach входной-файл
+ while читать-строку-в-буфер-шаблона
+ foreach шаблон
+ if строка-совпала-c-шаблоном-в-буфере
+ выполнить-команды ...
+
+Из них пользователем программируются только шаблоны и команды; таким образом ''sed'' берёт на себя часть «грязной» работы, связанной с чтением файлов и других рутинных действий.
Так как ''sed'' — потоковый редактор, он выполняет действия со строками текста. Операции ''sed'' ориентированы на построчную обработку потока текста, поступающего на стандартный ввод или из файлов.
- $ echo 'Hello!' | sed -n 'p;q'
+ ''Входной текст поступает на стандартный ввод через конвеер.''
+ $ echo 'Hello!' | sed -n 'p'
+ ''Входной текст поступает из файлов и регулярным выражением заменяется через команду подстановки.''
$ sed 's|^ooo:|qqq:|' /etc/passwd /etc/group
-По умолчанию ''sed'' печатает все строки, поступающие на стандартный ввод. Это поведение отключается опцией «''-n''». Выходные строки ''sed'' печатает на стандартный вывод и может быть использован как часть конвеера оболочки. Это распространённый практический приём — использование ''sed'' в качестве фильтра.
+По умолчанию ''sed'' печатает все строки, поступающие на стандартный ввод. Это поведение отключается опцией '''-n'''. Выходные строки ''sed'' печатает на стандартный вывод и может быть использован как часть конвеера оболочки. Это распространённый практический приём — использование ''sed'' в качестве фильтра.
+
+-- Использование в скриптах
+
+Если потоковый редактор ''sed'' используют в скриптах, то для повышения читаемости его команд их разделяют построчно. Каждую команду помещают на отдельную строку, в таком случае символ разделителя команд «;» не используется. Например, такой сценарий оболочки, использующий ''sed'', печатает только непустые строки из списка файлов или стандартного ввода (если список файлов пуст), заменяя в конце строки последовательность CR-LF (``'\r\n'``) на LF (``'\n'``):
--- Шаблоны
+ #!/bin/sh
+ sed -n '
+ /./ {
+ s/\r$//
+ p
+ }' "$@"
+
+Такой же пример записанный компактно в одну строку выглядит так:
+
+ $ sed -n '/./{s/\r$//;p}' /etc/passwd /etc/group
+
+- Шаблоны
Все команды языка оперируют в контексте шаблона, который соотносится с входной строкой. Шаблон может отсутствовать вообще, такой пустой шаблон действует на любую строку. Не пустой шаблон может быть регулярным выражением, номером строки или диапазоном.
@@ -36,39 +69,156 @@
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
$
- ''Печатаются строки из диапазона.''
- $ '''sed -n '/^lp/,/^uucp/p' '''
+ ''Печатаются строки из диапазона, заданного регулярным выражением.''
+ $ '''sed -n '/^lp/,/^uucp/p' /etc/passwd'''
+ lp:x:7:7:lp:/var/spool/lpd:/bin/sh
+ mail:x:8:8:mail:/var/mail:/bin/sh
+ news:x:9:9:news:/var/spool/news:/bin/sh
+ uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
+ $
+
+ ''Шаблон может быть смешанным: номер строки и регулярное выражение.''
+ $ '''sed -n '8,/^uucp/p' /etc/passwd'''
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
$
--- Команды редактирования
+Для обозначения номера последней строки в шаблоне зарезервирован символ «$».
+
+ $ '''sed -n '$p' /etc/passwd'''
+ telnetd:x:116:128::/nonexistent:/bin/false
+ $
+
+- Буфер шаблона
+
+Подчеркнём, что ''sed'' -- строчно-ориентированный язык. Строка, совпавшая с шаблоном, помещается в буфер шаблона. Большинство команд воздействуют на содержимое буфера шаблона, который по сути своей является переменной типа «строка».
+
+- Команды редактирования
Строка, совпавшая с шаблоном, помещается в буфер шаблона. Предыдущее значение буфера затирается.
-Со строкой в буфере шаблона выполняются различные действия редактирования: удаление (d), добавление (a), вставка (i), замена (c). В буфер шаблона может быть считана следующая строка (n) с удалением предыдущего значения или с приписыванием к нему (N) с символом переноса строки ('\n') в качестве разделителя.
+Со строкой в буфере шаблона выполняются различные действия редактирования: удаление (d), дополнение (a), вставка (i), замена (c). В буфер шаблона может быть считана следующая строка (n) с удалением предыдущего значения или с приписыванием к нему (N) с символом переноса строки ('\n') в качестве разделителя.
+
+Во всех следующих примерах будет использоваться стихотворение А. С. Пушкина «Ангел» в переводе Е. Бонвера.
+
+ $ '''cat angel.txt'''
+ By gates of Eden, Angel, gentle,
+ Shone with his softly drooped head,
+ And Demon, gloomy and resentful
+ Over the hellish crevasse flapped.
+ $
+
+-- Удаление
+
+Для удаления строки или диапазона строк задают шаблон, предшествующий команде удаления.
+
+ $ '''sed '1,2d' angel.txt'''
+ And Demon, gloomy and resentful
+ Over the hellish crevasse flapped.
+ $
--- Команда подстановки
+-- Дополнение
+
+Команда дополнения дописывает строку после совпавших с шаблоном строк.
+
+ $ '''sed '4aThe spirit of qualm and negation' angel.txt'''
+ By gates of Eden, Angel, gentle,
+ Shone with his softly drooped head,
+ And Demon, gloomy and resentful
+ Over the hellish crevasse flapped.
+ The spirit of qualm and negation
+ $
+
+-- Вставка
+
+Команда вставки приписывает строку до совпавших с шаблоном строк.
+
+ $ '''sed '4iThe spirit of qualm and negation' angel.txt'''
+ By gates of Eden, Angel, gentle,
+ Shone with his softly drooped head,
+ And Demon, gloomy and resentful
+ Over the hellish crevasse flapped.
+ The spirit of qualm and negation
+ $
+
+-- Замена
+
+Команда замены заменяет строки, совпавшие с шаблоном, на строку пользователя.
+
+ $ '''sed '4cThe spirit of qualm and negation' angel.txt'''
+ By gates of Eden, Angel, gentle,
+ Shone with his softly drooped head,
+ And Demon, gloomy and resentful
+ The spirit of qualm and negation
+ $
+
+-- Многострочные дополнение, вставка и замена
+
+Команды дополнения, вставки и замены могут дополнять, вставлять и заменять строку, совпавшую с шаблоном, несколькими строками. При вводе многострочных значений конец ввода определяется по символу перевода строки (``'\n'``), а предыдущие строки оканчивают знаком «\».
+
+ # '''sed '4aThe spirit of qualm and negation\'''
+ '''Looked at another one – of good,'''
+ '''' angel.txt'''
+ By gates of Eden, Angel, gentle,
+ Shone with his softly drooped head,
+ And Demon, gloomy and resentful
+ Over the hellish crevasse flapped.
+ The spirit of qualm and negation
+ Looked at another one – of good,
+ $
+
+- Команда подстановки
Наиболее употребительна команда подстановки (s), которая также действует с буфером шаблона.
-Действие команды подстановки изменяется дополнительными флагами. Например, действие подстановки можно повторить нерекурсивно ко всей строке множество раз (g), при подстановке выводить строку, если регулярное выражение подстановки дало совпадение (p).
+Действие команды подстановки изменяется дополнительными флагами. Например, действие подстановки можно повторить нерекурсивно ко всей строке множество раз (g), при подстановке выводить строку, если регулярное выражение подстановки дало совпадение (p). В команде подстановки по умолчанию используются POSIX базовые регулярные выражения (Basic Regular Expressions), как и во множестве прочих утилит Unix. Некоторые реализации ''sed'' позволяют применять расширенные регулярные выражения (Extended Regular Expressions) POSIX, например, для GNU sed достаточно включить опцию '''-r'''.
+
+ ''Использование sed вместо grep.''
+ $ '''sed -n '/^mysql/p' /etc/passwd'''
+ mysql:x:113:121:''''''MySQL'''''' Server,,,:/nonexistent:/bin/false
+ ''Заменяем значения подстрок командой подстановки.''
+ $ '''sed -n '/^mysql/{s/^mysql:/nosql:/;s/''''''MySQL''''''/''''''NoSQL''''''/;p}' /etc/passwd'''
+ nosql:x:113:121:''''''NoSQL'''''' Server,,,:/nonexistent:/bin/false
+ $
--- Управляющие конструкции
+Для предыдущего примера стоит дать пояснение, так как в нём задействованы управляющие конструкции. В команде, которая производит замену подстрок, используется шаблон. К строке, совпавшей с шаблоном, применяется три команды, сгруппированные в фигурных скобках (``{``…``}``). Каждая команда отделяется от предыдущей знаком «;».
-Команды группируются для применения к одному шаблону в фигурных скобках (`{`…`}`).
+- Управляющие конструкции
+
+Команды группируются для применения к одному шаблону в фигурных скобках (``{``…``}``).
Команды, следующие друг за другом при группировке разделяются точкой с запятой (;).
Если после шаблона поместить восклицательный знак (!), то следующие команды будут применены к не совпавшим с ним строкам. Это знак инверсии шаблона.
--- Буфер удержания
+-- Чтение строк
+
+В буфер шаблона может быть считана следующая строка текста (n) или добавлена к существующей (N); в последнем случае строки разделяются символом новой строки (``'\n'``).
+
+ ''В буфер шаблона помещается строка следующая после совпавшей с шаблоном.''
+ $ '''sed -n '/^root:/{n;p}' /etc/passwd'''
+ daemon:x:1:1:daemon:/usr/sbin:/bin/sh
+ $
+
+ ''В буфер шаблона приписывается строка следующая после совпавшей с шаблоном.''
+ $ '''sed -n '/^root:/{N;p}' /etc/passwd'''
+ root:x:0:0:root:/root:/bin/bash
+ daemon:x:1:1:daemon:/usr/sbin:/bin/sh
+ $
+
+- Буфер удержания
Буфер шаблона можно сохранить в буфере удержания. Для этого имеется четыре команды: копировать в буфер удержания с затиранием (h) и без затирания с приписыванием через символ новой строки (H), поместить содержимое буфера удержания в буфер шаблона с затиранием (g) и без затирания (G).
Ещё одна команда позволяет обменять значения буферов удержания и шаблона (x).
-- Метки и переходы
-Язык sed позволяет организовывать циклы.
-Для этого в нём имеются команды установки метки (:<label>), безусловного перехода на метку (b<label>), и условного перехода (t<label>). Последняя проверяет флаг, устанавливающийся при любых успешных подстановках для текущей входной строки; если таковые имели место, то выполняется переход на метку. Флаг сбрасывается при чтении следующей строки или при выполнении команды условного перехода (t).
+Язык ''sed'' позволяет организовывать циклы.
+Для этого в нём имеются команды установки метки (:<''label''>), безусловного перехода на метку (b<''label''>), и условного перехода (t<''label''>). Последняя проверяет флаг, устанавливающийся при любых успешных подстановках для текущей входной строки; если таковые имели место, то выполняется переход на метку. Флаг сбрасывается при чтении следующей строки или при выполнении команды условного перехода (t).
+
+- Литература
+
+ 1 ''''''McMahon'''''', L. E. SED: a Non-interactive Text Editor / L. E. ''''''McMahon''''''. — Bell Telephone Laboratories, 1979.
+ 1 Dougherty, D. UNIX text processing / Dale Dougherty, Tim O'Reilly. — Hayden Books, 1987. — Vol. 25943. — URL: http://www.oreilly.com/openbook/utp/.
+ 1 Peek, J. Unix Power Tools / Jerry Peek, Shelley Powers, Tim O'Reilly, Mike Loukides. — 3rd ed. — O'Reilly Media, October 2002.
+ 1 The Open Group Base Specifications Issue 7 [[Электронный ресурс]] : sed - stream editor / The IEEE and The Open Group. — IEEE Std 1003.1, 2013 Edition. — 2013. — Режим доступа: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html, свободный.
-----
-КатегорияЯзыкиПрограммирования
+# КатегорияЯзыкиПрограммирования