Разница между 1.23 и текущей версией ЯзыкSed.
@@ -1,20 +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
+
+- Шаблоны
 
 Все команды языка оперируют в контексте шаблона, который соотносится с входной строкой. Шаблон может отсутствовать вообще, такой пустой шаблон действует на любую строку. Не пустой шаблон может быть регулярным выражением, номером строки или диапазоном.
 
@@ -39,17 +70,35 @@
  $
 
  ''Печатаются строки из диапазона, заданного регулярным выражением.''
- $ '''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') в качестве разделителя.
 
 Во всех следующих примерах будет использоваться стихотворение А. С. Пушкина «Ангел» в переводе Е. Бонвера.
 
@@ -60,17 +109,19 @@
  Over the hellish crevasse flapped.
  $
 
---- Удаление
+-- Удаление
+
+Для удаления строки или диапазона строк задают шаблон, предшествующий команде удаления.
 
- ''Удаляются строки из диапазона с 1-й по 2-ю.''
  $ '''sed '1,2d' angel.txt'''
  And Demon, gloomy and resentful
  Over the hellish crevasse flapped.
  $
 
---- Добавление
- 
- ''Строка добавляется после 4-й строки.''
+-- Дополнение
+
+Команда дополнения дописывает строку после совпавших с шаблоном строк.
+
  $ '''sed '4aThe spirit of qualm and negation' angel.txt'''
  By gates of Eden, Angel, gentle,
  Shone with his softly drooped head,
@@ -79,9 +130,10 @@
  The spirit of qualm and negation
  $
 
---- Вставка
+-- Вставка
+
+Команда вставки приписывает строку до совпавших с шаблоном строк.
 
- ''Строка добавляется до 4-й строки.''
  $ '''sed '4iThe spirit of qualm and negation' angel.txt'''     
  By gates of Eden, Angel, gentle,
  Shone with his softly drooped head,
@@ -90,34 +142,83 @@
  The spirit of qualm and negation
  $
 
---- Замена
- 
- ''Строка вставляется вместо 4-й.''
- $ sed '4cThe spirit of qualm and negation' angel.txt'''
+-- Замена
+
+Команда замены заменяет строки, совпавшие с шаблоном, на строку пользователя.
+
+ $ '''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, свободный.
 
 # КатегорияЯзыкиПрограммирования