Шрифт:
Команды, управляемые командами
g
или v
, также могут использовать номера строк, текущая строка настраивается по очереди на каждую выбранную строку: g/thing/.,.+1р | Печатать каждую строку с thing и следующую |
g/^\.EQ/.1, /^\.EN/s/alpha/beta/gp | Заменять alpha на beta только между .EQ и .EN и печатать измененные строки |
Перемещение и копирование строк
Команда
m
перемещает группу смежных строк, а команда t
копирует группу строк: m,n,md | Переместить строки m по n за строку d |
m,n,td | Скопировать строки m по n за строку d |
Если исходные строки не определены, используется текущая строка. Строка назначения
d
не может быть в диапазоне m,n-1
. Ниже приведено несколько общих идиом, включающих m
и t
. m+ | Поместить текущую строку после следующей (переставить) |
m-2 | Поместить текущую строку перед предыдущей |
m-- | То же самое: это то же, что – 2 |
m- | Ничего не делать |
m$ | Поместить текущую строку в конец ( m0 — поместить в начало) |
t. | Дублировать текущую строку ( t$ дублирует в конце) |
– ,.t. | Дублировать предыдущую и текущую строки |
1,$t$ | Дублировать все множество строк |
g/^/m0 | Инвертировать порядок строк |
Метки и номера строк
Команда
=
печатает номер строки $
(слабое умолчание), .=
печатает номер текущей строки и т.д. Положение текущей строки не изменяется. Команда
kc
метит нужную строку буквой с
; впоследствии на эту строку можно ссылаться с помощью 'c
. Команда k
не меняет положение текущей строки. Метки удобны при перемещении больших фрагментов текста, поскольку они остаются привязанными к строкам, как показано в приведенной ниже последовательности: /.../ka | Найти строку ... и пометить буквой a |
/.../kb | Найти строку ... и пометить буквой b |
'a,'bp | Печатать целый диапазон, чтобы быть уверенным |
/.../ | Найти нужную строку |
'а,'bm | Поместить выбранные строки после нее |
Объединение, расщепление и реорганизация строк
Строки могут быть объединены с помощью команды
j
(пробелы не добавляются): m,nj | объединяет строки с m по n в одну |
jp | Объединить текущую строку со следующей и печатать |
– ,.jp | Объединить предыдущую строку с текущей и печатать |
По умолчанию принимается диапазон
.,.+1
; Строки можно расщепить командой подстановки, отделив новую строку:
s/part1part2/part1\part2/ | Расщепить строку на две части |
s/ /\ /g | Расщепить по каждому пробелу. Оставить одно слово на строку |
Текущей становится последняя созданная строка.
Чтобы манипулировать не только целыми фрагментами, выбираемыми регулярными выражениями, но и их соответствующими частями, используйте помеченные регулярные выражения: если конструкция
\(...\)
появляется в регулярном выражении, то часть соответствующего ей фрагмента доступна как \1
. Возможно до девяти помеченных выражений, на которые ссылаются с помощью \1
, \2
и т.д. s/\(...\)\(.*\)/\2\1/ | Поместить 3 первых символа в конец |
/\(..*\)\1/ | Найти строки, содержащие повторяющиеся смежные цепочки символов |
Команды, работающие с файлами
Командам
r
и w
(читать и писать) могут предшествовать номера строк: nr file | Читать file ; добавить его после строки n; текущей становится последняя прочитанная строка |
m,nw file | Писать строки m-n в file ; положение текущей строки не изменяется |
m,nw file | Добавить строки m-n к file ; положение текущей строки не изменяется |