Чтение онлайн

ЖАНРЫ

UNIX — универсальная среда программирования
Шрифт:

Регулярные выражения, использующие

*
, выбирают самое левое совпадение с образцом до тех пор, пока это возможно. Отметим, что
x*
может соответствовать нулю, а
xx*
одному или более символу.

Глобальные команды

Глобальные команды

g
и
v
управляют вызовом одной или большего числа других команд, выполняющих преобразования в множестве строк, выбранных регулярным выражением. Команда
g
наиболее часто используется для печати, подстановки или удаления множества строк:

m,ng/re/cmd
Для всех строк между m и n, которые соответствуют
re
выполнить cmd
m,nv/re/cmd
Для
всех строк между m и n, которые не соответствуют
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
; положение текущей строки не изменяется
Поделиться с друзьями: