Глава 5. Справочные материалы.

Содержание

Команды sed
a, c, i (Вывод символов из sed-скрипта в выходной поток).
b, t, T (Команды переходов).
c (см. a, c, i).
d (блокировка строки).
D (блокировка первой подстроки в многострочном режиме).
e (выполнение команды оболочки).
g (загрузка области удержания в буфер).
G (добавление области удержания к буферу).
h (загрузка буфера в область удержания).
H (добавление буфера к области удержания).
i (см. a, c, i).
l (преобразование непечатных символов).
L (обрезка строк).
n (загрузка следующей строки).
N (добавление следующей строки к буферу).
p (вывод буфера в выходной поток).
P (Вывод первой строки в выходной поток при многострочном режиме).
q (прерывание).
Q (прерывание без вывода буфера).
r (чтение файла).
R (чтение одной строки из файла).
s (поиск и замена подстроки).
t (См. b, t, T).
T (См. b, t, T).
v (проверка версии).
w (запись файла).
W (запись одной строки в файл).
x (обмен).
y (замена символов).
z (очистка).
Метасимволы и квантификаторы.
«.» {точка} (любой символ).
«[abc]» (символьный класс).
«[0-9]» (символьный диапазон).
[^xyz] (класс исключения).
\s (Пробельные символы).
\S (это любой не пробельный символ).
\w (словообразующий символ).
\W (это не словообразующий символ).
\n (перевод строки).
\oXXX (Восьмеричное представление символа).
() (скобки) и обратные ссылки (\1, \2, \3 и т.д.)
«|» альтернатива
\ Экранирование.
\xXX (шестнадцатеричное).
«^» (начало).
«$» (конец).
«\<» (левая граница слова).
«\>» (правая граница).
«\b» (граница слова).
\` (начало буфера).
\' (конец буфера).
* (любое число повторений).
+ (один или больше символов).
? (может есть, а может и нет).
{I,J} (повторение от I до J раз).
AABS
Вступление.
Разбор строки утилитой bash.
Разбор остальных параметров.
Глоббинг
Перенаправление в bash'е.

Команды sed

Важно

Все команды sed состоят из одной латинской буквы. Малые и БОЛЬШИЕ буквы различаются.

a, c, i (Вывод символов из sed-скрипта в выходной поток).

Эти команды не выполняются во время выполнения скрипта, однако они влияют на вывод буфера во время третьего этапа. Кроме вывода буфера, выводится так-же параметр команды (a|c|i), при этом, для первой команды вывод параметра идёт ДО буфера, для второй ВМЕСТО, а для третьей ПОСЛЕ. (см так-же info sed).

b, t, T (Команды переходов).

Это команды перехода. Команда b осуществляет безусловный переход к метке или (если метка не задана) к концу скрипта (точка между вторым и третьим этапом). Команда t осуществляет переход только в том случае, если прошлая команда s выполнилась успешно. Команда T осуществляет переход в случае если замена прошлой командой s НЕ выполнилась.

Важно

Если перед командой перехода есть больше одной команды s, то флаг перехода НЕОБХОДИМО очистить: выполните переход командой t после команды s которая ВСЕГДА выполняется. Можно поступить по другому - выполните переход на следующую команду. Не важно как вы туда попадёте, с переходом, или просто к следующей команде, важно что флаг будет сброшен. Пример смотрите чуть выше, в скрипте для подсчёта слов в тексте, а так-же в более простом примере выравнивания строк.
(см так-же info sed).

Замечание

Я посмотрел исходный текст: действительно, флаг перехода устанавливается командой s///, в том случае, если эта команда что-то нашла. Однако она не сбрасывает этот флаг в противном случае. Флаг сбрасывается во время загрузки строки из потока, и при выполнении команд t и T. Потому, если вам нужно перейти в зависимости от флага, и команда s не первая, то следует этот флаг сбросить, таким образом:
# эта команда иногда находит а иногда не находит, нас не волнует
# её результат
s/XXX/YYY/
# а дальше нам важно, нашли мы что-то, или нет, потому мы сбрасываем
# флаг. Для этого мы выполняем команду перехода, причём так, что-бы
# независимо от результата, работа скрипта не
# менялась, т.е. передаём управление туда, куда-бы скрипт перешёл и без
# команды перехода
t label
:label
s/ZZZ/FOUND/
# а вот здесь мы уже можем анализировать результат
# работы команды s///
t is_found_ZZZ
Любопытно, что никакие команды не сбрасывают этот флаг, только t и T.

c (см. a, c, i).

.

d (блокировка строки).

Эта команда "удаляет" из потока строку. На самом деле ничего не удаляется, просто эта команда подавляет вывод на третьем этапе, потому этой строки будет не видно. Кроме того, эта команда прерывает выполнение скрипта (как команда b.), т.о. все команды после d НЕ будут выполнены (конечно это не относится к командам на которые передастся управление командами b, t, T, а так же к командам, которые выполнятся если адресное выражение истинно). (см так-же info sed).

D (блокировка первой подстроки в многострочном режиме).

Команда D работает в точности так-же как и команда d, если в буфере нет символов перевода строки (\n), если такие символы есть, то команда выполняется иначе:
  1. Сначала удаляются все символы от начала буфера и до первого символа перевода строки (\n).
  2. После чего управление передаётся на третий этап, но в нём ничего не выводится (вывод подавлен, как и при выполнении команды d).
  3. Затем управление передаётся на второй этап (НЕ на первый, следующая строка НЕ загружается!). Таким образом, при использовании этой команды скрипт работает как цикл - обрабатывает строки из буфера до тех пор, пока они не кончатся.
Пример (см так-же info sed).

e (выполнение команды оболочки).

Эта команда выполняет shell-команду как отдельный процесс. Я её никогда не использую, вместо неё я использую модификатор e команды s. Пример. (см так-же info sed).

g (загрузка области удержания в буфер).

Эта команда копирует содержимое области удержания в буфер. (см так-же info sed).

G (добавление области удержания к буферу).

Эта команда добавляет в конец буфера `\n', а затем добавляет к буферу область удержания. (см так-же info sed).

h (загрузка буфера в область удержания).

А эта команда копирует буфер в область удержания. При этом старое содержимое области удержания стирается. (см так-же info sed).

H (добавление буфера к области удержания).

Данная команда сначала добавляет символ новой строки к области удержания, а затем добавляет содержимое буфера к области удержания. (см так-же info sed).

l (преобразование непечатных символов).

Вывод строки в переносимом формате: в этом режиме все "неправильные" символы (в т.ч. русские буквы) заменяются на восьмеричный код. Например:
$ head -n5 test.txt | sed 'l'
\367 \336\243\315 \317\324\314\311\336\311\305 Linux \317\324 Windows\
?$
В чём отличие Linux от Windows?
$

\351\304\305\317\314\317\307\311\336\305\323\313\311\305 \317\324\314\
\311\336\311\321$
Идеологические отличия
$

\357\324\314\311\336\311\321 \317\307\322\317\315\316\331. \344\317\
\323\324\301\324\317\336\316\317 \323\313\301\332\301\324\330, \336\
\324\317 Linux \327\323\243-\324\301\313\311 \316\301\304\317 \322\
\301\323\323\315\301\324\322\311\327\301\324\330 \313\301\313 \317\
\304\311\316 \311\332$
Отличия огромны. Достаточно сказать, что Linux всё-таки надо рассматривать как один из
В конец каждой строки добавляется `$'. Так-как эта команда не любит русские буквы, я её практически никогда не применяю. (см так-же info sed).

L (обрезка строк).

Обрезка длинных строк. Например:
$ sed -n 'L' test.txt
В чём отличие Linux от Windows?
Идеологические отличия
Отличия огромны. Достаточно сказать, что Linux всё-таки надо
рассматривать как один из
диалектов операционной системы UNIX, в то время как Windows является
оригинальной
разработкой компании Microsoft и начиналась как надстройка над
DOS. Таким образом всё что
появилось в Windows спустя годы после выхода в свет: многозадачность,
сетевые протоколы и
т.д., в Linux присутствовало практически изначально. Многие вещи
были просто портированы
(перенесены) в Linux из UNIX. Многие вещи, которые есть в Linux
недоступны в Windows до сих
Эта команда только режет строки, а для полноценного выравнивания их нужно ещё и склеивать, поэтому на практике я выравниваю текст без применения этой команды. (см так-же info sed).

n (загрузка следующей строки).

Эта команда загружает следующую строку в буфер. Если строки нет (текущая строка - последняя) происходит прерывание работы скрипта с переходом к третьему этапу. (см так-же info sed).

N (добавление следующей строки к буферу).

Эта команда работает так-же как n, однако новая строка не затирает буфер, а добавляется к нему через \n. (см так-же info sed).

p (вывод буфера в выходной поток).

Эта команда выводит содержимое буфера в выходной поток. (см так-же info sed).

P (Вывод первой строки в выходной поток при многострочном режиме).

Данная команда так-же выводит буфер в выходной поток, однако выводится только первая строка, от начала до первого \n. (см так-же info sed).

q (прерывание).

Команда для выхода из скрипта. После выполнения третьего этапа скрипт завершается. Например:
$ sed '5q' test.txt
В чём отличие Linux от Windows?

Идеологические отличия

Отличия огромны. Достаточно сказать, что Linux всё-таки надо рассматривать как один из
Эта команда может иметь параметр, тогда код завершения скрипта ($?) равен параметру. Пример. (см так-же info sed).

Q (прерывание без вывода буфера).

Работает в точности как q, однако вывод на третьем этапе не происходит. (см так-же info sed).

r (чтение файла).

Данная команда загружает файл в выходной поток (НЕ в буфер!). Я её редко использую. (см так-же info sed).

R (чтение одной строки из файла).

Эта команда читает одну строчку из файла в выходной поток. (см так-же info sed).

s (поиск и замена подстроки).

Команда замены. Производит поиск регулярного выражения и заменяет его на выражение для замены. Может использоваться со многими модификаторами. (см так-же info sed).

t (См. b, t, T).

T (См. b, t, T).

(см так-же info sed).

v (проверка версии).

Проверка версии sed. Например:
$ sed 'v 4.7' ~/.bashrc
sed: -e expression #1, char 5: expected newer version of sed
$ sed 'v 3' /home/doc/.bashrc
# .bashrc

DT=`date`
...
				
Таким образом sed выполняется только если её версия достаточно новая.

Подсказка

Можно использовать эту команду для написания скриптов, в которых используются новые команды, например z.
(см так-же info sed).

w (запись файла).

Запись буфера в файл. (см так-же info sed).

W (запись одной строки в файл).

Запись буфера в файл. Записывается только одна строка, при этом запись происходит в конец файла, как при использовании перенаправления >>. (см так-же info sed).

x (обмен).

Обмен содержимого области удержания и буфера. (см так-же info sed).

y (замена символов).

Замена символов. Меняет символы из первого списка на символы из второго. Пример. (см так-же info sed).

z (очистка).

Внимание

Это новая команда, она не работает в большинстве старых реализациях sed.
Команда z очищает буфер. (см так-же info sed).

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

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