Утилита sed, версия 4.0.9
Замечание
Данная глава представляет собой полный перевод man-страницы.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 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
- Эта команда выполняется следующим образом:
- Сначала из буфера удаляются первые символы до символа '\n' включительно, если такой символ есть. (если нет - удаляются все символы)
- В случае, если в строке остались символы, работа скрипта прерывается, и выполняется переход к началу скрипта. При этом символы не читаются из входного потока, а остаются те, что остались после п1.
- Если в буфере нет символов (после удаления в п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 ╘ 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 для оплаты хостинга, интернета, и прочего. Это конечно добровольно, однако это намного улучшит данный документ (у меня будет больше времени для его улучшения). На самом деле, проект часто находится на грани закрытия, ибо никаких денег никогда не приносил, и приносить не будет. Вы можете мне помочь. Спасибо.