Некоторые символы имеют для
редактора особое значение. К ним
относятся: ".", "\", "$",
"*", "[", "]", "^",
"&". Эти символы обычно
называются метасимволами.
6.16.1. Метасимвол . (точка)
В зависимости от контекста символ
"." имеет несколько значений. lin
В левой части команды подстановки и
при поиске с помощью конструкции
"/.../" символ "." означает
любой одиночный символ. Таким
образом, в результате поиска
/x.y/
будут найдены строки текста,
содержащие символы "x" и
"y", между которыми находится
любой символ, например:
x+y
x-y
x y
Символ ".", используемый для
указания номера строки обозначает
текущую строку.
Примеры.
.+1s/a/,/
замена символа "a" на символ
"," в строке, следующей за
текущей. Символ ".", записанный
в правой части команды замены
"s", не имеет специального
значения;
1, 5s/,/./
замена символа "," на символ
"." в строках с 1-й по 5-ю
включительно.
Команда :
.s/././
иллюстрирует все значения
символа ".". Первая "." в
команде - это номер текущей строки,
вторая "." это метасимвол,
который соответствует любому
одному символу данной строки,
третья "." - это настоящая точка
в команде замены.
Такая команда, примененная,
например к строке:
ОШИБКА ЧТЕНИЯ.
дает результат:
ОШИБКА ЧТЕНИЯ.
6.16.2. Метасимвол \ (обратная
дробная черта)
Обратная дробная черта (или
обратный слэш) отменяет
специальное значение, которое
может иметь следующий за ней
символ, в частности, "\."
означает точку, а не "любой
символ". Примеры.
s/\./?/
замена символа "." на символ
"?";
/\.pp/
поиск строк, содержащих ".pp";
/\/
поиск символа "\";
/\//
поиск символа "/";
s/\\\.//
удаление в текущей строке
последовательности символов
".".
Для разделения полей в команде
"s" может использоваться любой
символ, а не только дробная черта
(однако для контекстного поиска
требуется использовать дробную
черту). Например, если строка уже
содержит много символов дробной
черты, как в строке:
//exec//sys.fort.go //etc ...
то можно использовать в качестве
разделителей символ ":"
(двоеточие). Удалить все символы
дробной черты можно с помощью
команды:
s:/::g
Если для стирания символов и
удаления строк используются
клавиши "#" и "@", их нужно
вводить в виде "\#" и "\@"
(это относится не только к работе с
ed).
Если текст вводится с помощью
одной из команд: "a", "i" или
"c", то символ обратной дробной
черты не является специальным, и
требуется нажимать эту клавишу
только один раз для каждой обратной
дробной черты.
6.16.3. Метасимвол $ (денежный знак)
В зависимости от того, как
используется знак денежной единицы
($), он может обозначать конец файла
или конец строки. Когда указывается
диапазон (от строки 1 до строки $),
совершенно ясно, что речь идет о
конце файла. "1, $p" вызовет
распечатку всего файла. Но запись
"s/$/./p" указывает, что точка
будет помещена в конце текущей
строки.
В команде:
$s/$/$
первый символ "$" означает
последнюю строку файла, второй
означает конец этой строки, а
третий действительно является
символом денежной единицы, который
добавляется к указанной строке.
6.16.4. Метасимвол ^ (отрицание)
Метасимвол "^" применяется
так же, как метасимвол "$", за
исключением того, что он указывает
начало строки, а не конец.
Примеры.
/^время/
поиск строки, начинающейся со
слова "время";
s/^/ /
поместить пробел в начало текущей
строки.
Метасимволы можно объединять.
Например, для того, чтобы найти
строку, содержащую только символы
"pp" можно использовать
команду: /^.pp$/
6.16.5. Метасимвол * (звездочка)
Метасимвол "*" означает, что
символ, за которым он следует, может
повторяться произвольное число
раз.
Если в тексте имеется большое
количество пробелов, их можно
сжать, например:
Московское время 18 часов
В результате выполнения команды:
s/e *время 1/e время 1/p
получим:
Московское время 18 часов
Если скомбинировать точку и *, то
можно сопоставить все символы. С
помощью этой комбинации можно,
например, заменить все символы в
последней части строки:
p<CR>
Toads are alimy, cold creatures
s/are.*/are wonderful and warm <CR>
Toads are wonderful and warm
ed автоматически запоминает
последнюю строку символов в
шаблоне поиска или замененный
текст. Однако вы должны подсказать
ed, что нужно повторить замену,
используя знак "%". Знак "%"
позволяет вам сделать одинаковую
замену во многих строках, не
используя глобальной замены.
Например, заменим слово money на слово
gold, повторим последнюю замену в
строках от 1 до 3:
1, $n<CR>
1 I love money
2 I need food
3 I use money
4 The IRS wants my money
ls/money/gold<CR>
I love gold
3s//g<CR>
I use gold
1, $n<CR>
1 I love gold
2 I need food
3 I use gold
4 The IRS wants my money
ed автоматически запоминает слово
money, так что строка не будет
повторена между первыми двумя
ограничителями. Знак "%"
говорит ed - использовать последний
шаблон для замены (gold).
6.16.6. Метасимволы [] (квадратные
скобки)
Метасимволы "[]" позволяют
определить подмножество символов,
которые необходимо распознавать
при выполнении операции поиска или
подстановки. Запись группы
символов, заключенных в квадратные
скобки, означает: "любой
одиночный символ из указанных".
Например, если "[0123456789]", это
будет означать: "любая цифра".
Можно записать и короче: "[0-9]".
Запись двух символов, разделенных
знаком минус, означает задание
интервала в
лексикографической
последовательности символов. Так,
запись "[А-Я]" означает:
"прописная русская буква", а
запись: "[a-z] [a-z0-9]*" означает
последовательность латинских букв
и цифр, начинающуюся с буквы.
Указание в начале класса символа
"^" означает "ни один из
следующих символов". Например:
^[0-9]
обозначает "любой символ, за
исключением цифры".
Примеры.
1, $s/^[0-9]*//
удаление всех цифр в начале
каждой строки;
/^[^(пробел)(табуляция)]/
поиск первой строки, не
начинающейся символом пробела или
табуляции.
Внутри класса символов могут
присутствовать любые символы и,
чтобы избежать путаницы, в
квадратных скобках символы
принципиально не имеют
специального значения. Например,
чтобы найти специальные символы,
можно использовать команду:
/[.[]/
Внутри "[...]" символ "[" не
является специальным. Чтобы
включить символ "]" в класс
символов, нужно указать его первым.
6.16.7. Метасимвол & (амперсенд)
Символ "&" используется в
первую очередь для сокращения
вводимого текста.
Предположим, имеется строка:
В ЭТО ВРЕМЯ
и требуется преобразовать ее в
строку:
В ЭТО ВРЕМЯ СУТОК
конечно, для этого можно
воспользоваться командой:
s/ВРЕМЯ/ВРЕМЯ СУТОК/
однако требование повторно
указывать слово "ВРЕМЯ"
кажется неразумным. Для того, чтобы
избежать этого повторения,
используется символ "&". В
правой части команды подстановки
амперсенд означает "найденный
текст", так что можно ввести
команду:
s/ВРЕМЯ/& СУТОК/
где "&" будет означать
"ВРЕМЯ". Конечно, в данном
примере экономия будет
незначительной, однако если
количество символов велико или
представляет собой нечто вроде
".*", которому соответствует
большой кусок текста, экономится
много вводимых символов. Снижается
также вероятность совершения
ошибки при вводе заменяющего
текста. Например, для того, чтобы
заключить в скобки строку,
независимо от ее длины, можно
использовать команду:
s/.*/(&)/
Амперсенд может встречаться в
правой части команды несколько раз.
Команда:
s/ВРЕМЯ/& СУТОК И & ГОДА/
построит строку:
ВРЕМЯ СУТОК И ВРЕМЯ ГОДА
а команда:
s/В ЭТО ВРЕМЯ/&? &!!!/
преобразует исходную строку в:
В ЭТО ВРЕМЯ? В ЭТО ВРЕМЯ!!!
Чтобы получить настоящий символ
"&", используется обратная
дробная черта для отмены его
специального значения. Команда:
s/амперсенд/\&/
заменит слово "амперсенд" на
символ "&". Обратите внимание
на то, что символ "&" является
специальным только в правой части
команды, в левой части он не имеет
специального значения.
|