Глава 3. man sed (русский перевод)

Содержание

Утилита sed, версия 4.0.9
SYNOPSIS
Описание
Опции командной строки
Описание sed-команд
Адресация
Регулярные выражения
Ошибки
COPYRIGHT
Ссылки

Утилита sed, версия 4.0.9

Замечание

Данная глава представляет собой полный перевод man-страницы.

SYNOPSIS

sed [опции]... {только-скрипт-если-нет-других-скриптов} [файл(ы)]...

Описание

Sed это потоковый редактор. Потоковый редактор используется для базовых изменений текста в виде входящего потока (из файла, или из входного pipe потока). Команды sed чуть менее чем полностью позаимствованные из древнего текстового редактора ed. Sed обрабатывает текстовые строки и сам текст исключительно за один проход. Sed может использоваться как фильтр, для обработки текстов созданных другими текстовыми редакторами, а так-же для фильтрации и обработки текстовых данных выводимых другими утилитами.

Опции командной строки

-n, --quiet, --silent
Подавление автоматического вывода буфера после обработки.
-e script, --expression=script
Добавить sed-скрипт для обработки.
-f script-file, --file=script-file
Добавить для обработки содержимое файла (файл будет обрабатываться как sed-скрипт).
-i[suffix], --in-place[=suffix]
Редактирование файла на месте. (возможно создание резервной копии, если используется суффикс).
-l N, --line-length=N
Задаёт значение для обрезки строк командой l.
-r, --regexp-extended
Использование расширенных регулярных выражений в sed-скрипте.
-s, --separate
Сепаратор. Разделение потока на отдельные файлы, по умолчанию sed считает все входящие файлы как один длинный поток, а с этой опцией файлы разделены (например, для каждого файла первая строка будет именно первой, а адрес $ будет совпадать с каждой последней строкой, а не только с последней строкой последнего файла).
-u, --unbuffered
Использование минимально возможного размера буферов.
--help
Показать краткую справку и выйти.
-V, --version
Показать номер версии и выйти.
Если не применяются опции -e, --expression, -f, или --file, тогда первый аргумент не являющийся опцией интерпретируется как sed-скрипт. Все остальные аргументы интерпретируются как входящие файлы. Если файл для обработки не задан, sed читает данные из входного потока.

Описание sed-команд

Это краткое описание команд. Оно предназначено для тех, кто уже знаком с работой этого редактора. Для изучения полного описания команд, смотрите sed info.
Безадресные команды
: label
Эта команда задаёт метку, для перехода к ней командами b, t, и T.
#comment
Комментарий, который продолжается до конца строки (или до конца фрагмента скрипта в опции -e).
}
Завершение блока команд {...}.
Команды которые используются с одним адресом или без адреса
=
Вывод в выходной поток номера текущей строки.
a text
Вывод в выходной поток text'а, после вывода обработанного буфера. Можно вывести несколько строк, если в конце каждой строки добавить обратный слеш '\'.
i text
Так-же как a, но text выводится перед буфером.
q
Выход из скрипта. При этом больше никаких данных не читается из входного потока. Если разрешён вывод буфера, то он выводится в выходной поток.
Q
Так-же как q, но буфер не выводится.
r file
Добавляет к выводу текст прочитанный из file.
R file
Добавляет к выводу одну строку прочитанную из file.
Команды, которые можно использовать с диапазоном адресов.
{
Начала блока команд. (В конце блока ставится }).
b label
Переход на метку label. Если такой метка не задана, то переход выполняется в конец скрипта.
t label
Если команда s/// произвела успешный поиск и замену последней прочитанной строки, то эта команда передаёт управление на метку label. Если метка не задана, переход осуществляется в конец скрипта.

Замечание

Если перед t выполнилось несколько команд s///, то переход будет выполнятся в зависимости от результата работы первой команды s///. Для сброса флага используйте ещё одну команду перехода, например:
# эта команда находит и заменяет всегда (т.к. у любой строки есть начало).
s/^/BEGIN:/
# для сброса флага перехода, мы осуществляем переход на метку lb
t lb
:lb
# а эта команда не всегда меняет (т.к. не во всех строках есть буква Z)
s/Z/z/
# сл. переход выполнится только для строчек, в которых была буква Z, которая поменялась на z.
t is_z
T label
Так-же как t, но переход выполняется если замены не было.
c text
Так-же как a, но текст выводится вместо вывода буфера.
d
Удаление буфера. Начало нового цикла.

Замечание

Тут не всё так просто: эта единственная команда (не считая D), которая осуществляет неявный переход к выполнению нового цикла - после обработки этой команды, все последующие команды не выполняются, а содержимое буфера никогда не выводится в выходной поток.
D
Эта команда выполняется следующим образом:
  1. Сначала из буфера удаляются первые символы до символа '\n' включительно, если такой символ есть. (если нет - удаляются все символы)
  2. В случае, если в строке остались символы, работа скрипта прерывается, и выполняется переход к началу скрипта. При этом символы не читаются из входного потока, а остаются те, что остались после п1.
  3. Если в буфере нет символов (после удаления в п1), то выполнение скрипта так-же прерывается, но после этого происходит загрузка новой строки из входного потока в буфер. В этом случае, выполнение эквивалентно команде d.
h H
Копирование/добавление буфера в/к области удержания.
g G
Копирование/добавление области удержания в/к буферу.
x
Обмен содержимого буфера и области удержания.
l
Вывод текущей строки в читаемом виде (visually unambiguous).
n N
Чтение строки из входного потока, и копирование/добавление её в буфер. Если строка добавляется (команда N), то новая строка отделяется от старой символом '\n'.
p
Вывод буфера в выходной поток.
P
Вывод первых символов до '\n' в выходной поток.
s/regexp/replacement/
Поиск регулярного выражения regexp в буфере. Если такое выражение будет найдено, то оно меняется на replacement. Выражение для замены replacement может содержать специальный символ &, который подменяется на найденную подстроку. Кроме того, replacement может содержать обратные ссылки (\1, \2, \3 ... \9), которые ссылаются на подвыражения в regexp.

Замечание

про \0: это вполне рабочая ссылка, и она эквивалентна &. На самом деле, я использую \0 по той причине, что ампресанд не лепится в формат DOCBOOK. Следует учитывать, что \0 нестандартная конструкция, хотя она и работает во всех известных мне реализациях sed.
w filename
Запись буфера в файл filename.
W filename
Запись первой строки из буфера в файл filename.
y/source/dest/
Транслитерация символов в буфере. Заменяются символы из списка source на символы в списке dest.

Адресация

Sed команды могут использоваться без адреса, в этом случае, команда проверяет все строки входящего текста. Так-же команда может использоваться с одним адресом, тогда команда выполнится только для тех строк, которые совпадают с адресом. Кроме того, в качестве адреса можно использовать диапазон adr1,adr2. При этом команда будет обрабатывать все строки начиная с той, которая совпадает с adr1 и заканчивая той, с которой совпадает adr2. Если в качестве adr2 используется регулярное выражение, то оно не будет проверятся в первой строке диапазона (в первой строке совпадающей с adr1).

После адреса (или адресного диапазона), и перед командой, можно поставить !, который приведёт к инвертированию адреса (команда выполнится для всех строк кроме той, что совпадает с адресом или с адресным диапазоном).

Поддерживаемые типы адресных выражений:

number
Совпадает только со строкой с номером number.
first~step
Совпадает со строками начиная с first, с шагом step. Например
sed -n '1~2p'
выведет только нечётные строки. Адресное выражение 2~5 совпадает с каждой пятой строкой начиная со второй (2,7,12,17...). (Это GNU расширение).
$
Совпадает с последней строкой последнего файла (или с последней строкой каждого файла при использовании опции -s).
/regexp/
Совпадает со строкой, в которой найдётся выражение regexp.
\cregexpc
Совпадает со строкой, в которой найдётся выражение regexp. (c может быть любым символом.)

GNU sed поддерживает несколько специальных диапазонов адресов:

0,adr2
Этот диапазон работает в точности так же как 1,adr2, в случае если самая первая строка не совпадает с adr2. Если первая строка совпадает с adr2, то весь диапазон совпадает только с этой строкой (выражение 1,adr2 совпадает со строками начиная с первой, и далее для всех, до строки совпадающей с adr2, при этом проверяются строки начиная со второй, первая не проверяется).
adr1,+N
Совпадает со строкой adr1 и ещё с N строками после неё.
adr1,~N
Совпадает со строками от adr1 и до строки, которая кратна N (включительно, кратность проверяется начиная со строки, которая следует за строкой adr1). К примеру, 4,~4 совпадает со строками 4,5,6,7, и 8. Восемь - ближайшее кратное к четырём начиная с пяти.

Регулярные выражения

Регулярные выражения стандарта POSIX.2 не полностью поддерживаются, потому-что полная поддержка этого стандарта приведёт к проблемам производительности. Символ '\n' в регулярных выражениях совпадает с символом перевода строки, кроме того, поддерживаются символы \a, \t и другие.

Ошибки

E-mail bug reports to bonzini@gnu.org. Be sure to include the word ``sed'' somewhere in the ``Subject:'' field. Also, please include the output of ``sed --version'' in the body of your report if at all possible.

Замечание

Непонятно? А что делать... Нужно сначала выучить английский, а потом писать разработчикам про ошибки. К сожалению русского они не понимают :-(

Впрочем вы можете писать на форум. Попытаюсь ответить, а если не смогу - отправлю весточку разработчикам.

Подробнее про ошибки см. здесь.

COPYRIGHT

Copyright ╘ 2003 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law.

Тут я надеюсь всё понятно: гарантий НИКАКИХ.

Ссылки

awk(1), ed(1), grep(1), tr(1), perlre(1), sed.info, any of various books on sed, the sed FAQ (http://sed.sf.net/grabbag/tutorials/sedfaq.html), http://sed.sf.net/grabbag/.

The full documentation for sed is maintained as a Texinfo manual. If the info and sed pro-grams are properly installed at your site, the command

info sed

См. также: info sed. Русский перевод., там более полная документация по-русски.

should give you access to the complete manual.

sed version 4.0.9 January 2004

Замечание

Переведено drBatty 2010г.

При переводе использовались оригинальные ман и инфо страницы для GNU sed версий 4.0.9 и 4.2. Кроме того были использованы исходные тексты для выяснения некоторых тонких моментов реализации.

Вы можете обсудить этот документ на форуме. Текст предоставляется по лицензии GNU Free Documentation License (Перевод лицензии GFDL).

Вы можете пожертвовать небольшую сумму яндекс-денег на счёт 41001666004238 для оплаты хостинга, интернета, и прочего. Это конечно добровольно, однако это намного улучшит данный документ (у меня будет больше времени для его улучшения). На самом деле, проект часто находится на грани закрытия, ибо никаких денег никогда не приносил, и приносить не будет. Вы можете мне помочь. Спасибо.