Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операционная система UNIX.doc
Скачиваний:
94
Добавлен:
01.05.2014
Размер:
1.67 Mб
Скачать

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/амперсенд/\&/

заменит слово "амперсенд" на символ "&". Обратите внимание на то, что символ "&" является специальным только в правой части команды, в левой части он не имеет специального значения. 6.17. Дополнительные возможности

Соседние файлы в предмете Операционные системы