UNIX — универсальная среда программирования
Шрифт:
Регулярные выражения, использующие
*
, выбирают самое левое совпадение с образцом до тех пор, пока это возможно. Отметим, что x*
может соответствовать нулю, а xx*
одному или более символу. Глобальные команды
Глобальные команды
g
и v
управляют вызовом одной или большего числа других команд, выполняющих преобразования в множестве строк, выбранных регулярным выражением. Команда g
наиболее часто используется для печати, подстановки или удаления множества строк: m,ng/re/cmd | Для всех строк между m и n, которые соответствуют re выполнить cmd |
m,nv/re/cmd | Для
re выполнить cmd |
Командам
g
и v
могут предшествовать номера строк, ограничивающие диапазон; по умолчанию принимается диапазон 1,$
: g/.../p | Печатать все строки, соответствующие регулярному выражению ... |
g/.../d | Убрать все строки соответствующие ... |
g/.../s//repl/p | Заменить первое вхождение ... в каждой строке на 'repl ', печатать измененные строки |
g/.../s//repl/gp | Заменить каждое ... на 'repl ' , печатать измененные строки |
g/.../s/pat/repl/ | В строках, соответствующих ... , заменить первую 'pat ' на 'repl ' |
g/.../s/pat/repl/p | В строках, соответствующих ... , заменить первую 'pat ' на 'repl ' и печатать |
g/.../s/pat/repl/gp | В строках, соответствующих ... , заменить все 'pat ' на 'repl ' и печатать |
v/.../s/pat/repl/gp | В строках, не соответствующих ... , заменить все 'pat ' на 'repl ' и печатать |
v/^$/p | Печатать все непустые строки |
g/.../cmd1\cmd2\cmd3 | Выполнять составные команды с единственной g , присоединить \ к каждой cmd кроме последней |
Команды, управляемые командами
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 ; положение текущей строки не изменяется |
Поделиться с друзьями: