Шрифт:
Отметим, что
1,$s
вызывает команду для обработки каждой строки, но это означает лишь самое левое вхождение образца в каждой строке; нужна заключительная команда 'g
', чтобы заместить все вхождения во всех строках. Кроме того, p
выдает только последнюю измененную строку. Для вывода всех измененных строк необходима глобальная команда, которую мы вскоре рассмотрим. Символ
&
означает сокращение; оказавшись где либо справа от команды s
, он заменяется образцом из левой части: s/big/very &/ | Заменить big на very big |
s/big/& &/ | Заменить big на big big |
s/.*/(&)/ | Взять в скобки целую строку (см. .* ниже) |
s/and/\&/ | Заменить and на & (\ отключает специальное значение символа) |
Метасимволы и регулярные выражения
Как и символы
*
, >
, :
, имеющие специальный смысл в shell
, некоторые символы имеют специальный смысл для ed
, если они появляются в образце для поиска или в левой части команды s
. Эти символы называют метасимволами, а использующие их образцы регулярными выражениями. В табл. П.1.1 перечислены все символы и их значения. Примеры, приведенные ниже, следует читать в соответствии с таблицей. Специальный смысл любого символа может быть отменен предшествующей ему обратной дробной чертой '\
'. с | Любой специальный символ задает совпадение с таким же символом |
\c | Отменяет специальный смысл символа с |
А | Соответствует началу строки, когда ^ начинает образец |
$ | Соответствует концу строки, когда $ заканчивает образец |
. | Совпадает с любым одиночным символом |
[...] | Соответствует одному любому символу в ... ; допустимы диапазоны типа a-z |
[^...] | Соответствует любому одиночному символу, не входящему в ... ; допустимы диапазоны |
r* | Соответствует нулевому или более числу вхождений r , где r символ, или [...] |
& | Используется только в правой части s; вставляет фрагмент, совпавший с образом |
\(...\) | Помечает регулярное выражение; найденная строка доступна как \1 , и т.д. в левой и правой частях выражения |
Таблица П.1.1: Регулярные выражения редактора
Символу перевода строки не соответствует ни одно регулярное выражение.
Образец | Соответствие |
---|---|
/^$/ | пустая строка, т.е. только конец строки |
/./ | непустая, т.е. по крайней мере один символ |
/^/ | все строки |
/thing/ | thing где либо в строке |
/^thing/ | thing в начале строки |
/thing$/ | thing в конце строки |
/^thing$/ | строка, состоящая лишь из thing |
/thing.$/ | thing плюс любой символ в конце строки |
/thing\.$/ | thing. в конце строки |
/\/thing\// | /thing/ где либо в строке |
/[tT]hing/ | thing или Thing где либо в строке |
/thing[0-9]/ | thing , за которой одна цифра |
/thing[^0-9]/ | thing , за которой не цифра |
/thing[0-9][^0-9]/ | thing , за которой цифра и не цифра |
/thing1.*thing2/ | thing1 , затем любая строка, затем thing2 |
/^thing1.*thing2$/ | thing1 в начале и thing2 в конце |
Регулярные выражения, использующие
*
, выбирают самое левое совпадение с образцом до тех пор, пока это возможно. Отметим, что 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 кроме последней |