Команды, управляемые командами
g
или
v
, также могут использовать номера строк, текущая строка настраивается по очереди на каждую выбранную строку:
g/thing/.,.+1р
| Печатать каждую строку с thing и следующую |
g/^\.EQ/.1, /^\.EN/s/alpha/beta/gp
| Заменять alpha на beta только между .EQ и .EN и печатать измененные строки |
Перемещение и копирование строк
Команда
m
перемещает группу смежных строк, а команда
t
копирует группу строк:
<i>m</i>,<i>n</i>,md
| Переместить строки m по n за строку d |
<i>m</i>,<i>n</i>,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
(пробелы не добавляются):
<i>m</i>,<i>n</i>j
| объединяет строки с m по n в одну |
jp
| Объединить текущую строку со следующей и печатать |
-,.jp
| Объединить предыдущую строку с текущей и печатать |
По умолчанию принимается диапазон
.,.+1
;
Строки можно расщепить командой подстановки, отделив новую строку:
s/part1part2/part1\part2/
| Расщепить строку на две части |
s/ /\ /g
| Расщепить по каждому пробелу. Оставить одно слово на строку |
Текущей становится последняя созданная строка.
Чтобы манипулировать не только целыми фрагментами, выбираемыми регулярными выражениями, но и их соответствующими частями, используйте помеченные регулярные выражения: если конструкция
\(...\)
появляется в регулярном выражении, то часть соответствующего ей фрагмента доступна как
\1
. Возможно до девяти помеченных выражений, на которые ссылаются с помощью
\1
,
\2
и т.д.
s/\(...\)\(.*\)/\2\1/
| Поместить 3 первых символа в конец |
/\(..*\)\1/
| Найти строки, содержащие повторяющиеся смежные цепочки символов |
Команды, работающие с файлами
Командам
r
и
w
(читать и писать) могут предшествовать номера строк: