8.2. Специальные символы

shell имеет также и другие символы, которые выполняют различные полезные функции.

8.2.1. Запуск команды в фоновом режиме (символ &)

Некоторые команды shell занимают много времени при выполнении. Эти команды можно запустить в фоновом режиме с использованием &, освобождая тем самым терминал для других задач. Общий формат для запуска команд в фоновом режиме следующий:

command &<CR>

Примечание. Интерактивные команды shell (например, read) нельзя запускать в фоновом режиме.

Когда вы запускаете команду в фоновом режиме, то система UNIX выводит номер процесса. Вы можете использовать этот номер для завершения выполняющейся в фоновом режиме команды. Появившаяся подсказка означает, что терминал свободен и ожидает вашу команду.

Запустить команду в фоновом режиме вы можете только в том случае, если ваш терминал предоставляет вам такую возможность.

8.2.2. Последовательное выполнение команд (символ ;)

В одной командной строке вы можете указать несколько команд. Эти команды должны быть разделены символом ; (точка с запятой) или символом & (амперсанд):

command1; command2; command3<CR>

Система UNIX выполняет команды в том порядке, в котором они стоят в командной строке, и печатает вывод этих команд в том же порядке. Этот процесс называется последовательным выполнением.

Например, введите:

cd; pwd; ls<CR>

shell выполнит эти команды последовательно:

cd изменит ваше местоположение, переместив вас в регистрационный справочник;

pwd распечатает полное имя пути вашего текущего справочника;

ls перечислит файлы в вашем текущем справочнике.

8.2.3. Отмена специального значения (метасимвол \)

Символ \ позволяет вам отменить специальное значение следующего за ним символа. Например, у вас есть файл trail, который содержит следующий текст:

The all * game

was held in Summit.

Чтобы найти символ звездочка (*) в файле, воспользуйтесь командой grep:

$ grep \* trail<CR>

The all * game

$

команда grep найдет символ * в тексте и отобразит строку, в которой она появилась. Без символа \, символ звездочка будет интерпретироваться shell как метасимвол.

8.2.4. Отмена специального значения (метасимвол кавычки)

Отменить специальное значение символа вы также можете с помощью метасимвола кавычки. Одиночные кавычки ('...') отменяют специальное значение всех символов за исключением самих одиночных кавычек. Двойные кавычки ("...") отменяют специальное значение всех символов, за исключением символов двойные кавычки, $ и `(слабое ударение). Использование кавычек удобно для цифровых специальных символов.

Например, ваш файл trail содержит строку:

He really wondered why? Why???

Чтобы найти строку, содержащую три вопросительных знака, воспользуйтесь командой grep:

$ grep '???' trail<CR>

He really wondered why? Why???

$

8.2.4.1. Использование кавычек для отмены значения символа пробел

Кавычки аналогично обратной косой черте часто используются для отмены специального значения пробела. shell интерпретирует пробел в командной строке как разделитель между аргументами команды. Одиночные и двойные кавычки и обратная косая черта позволяют отменить это значение.

Например, чтобы в тексте разместить два или более слова, сделайте эти два слова одним аргументом, заключив их в кавычки. Чтобы найти два слова "The all" в файле trail, введите следующую команду:

$ grep 'The all' trail<CR>

The all * game

$

Особенно полезно применение отмены специального значения пробела для функции banner, которая использует пробел как разделитель аргументов и печатает аргументы на отдельных строках.

Чтобы напечатать более одного аргумента на одной строке, заключите слова в двойные кавычки. Например, если вы введете:

banner happy birthday to you<CR>

то команда banner напечатает ваше сообщение на 4-х строках. Если вы введете:

banner happy birthday "to you"<CR>

то команда banner напечатает ваше сообщение на 3-х строках, причем слова "to" и "you" напечатает на одной строке.

Команда banner печатает сообщения на экране терминала большими плакатного размера буквами.

6.16. Специальные символы Некоторые символы имеют для редактора особое значение. К ним относятся: ".", "\", "$", "*", "[", "]", "^", "&". Эти символы обычно называются метасимволами. 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/амперсенд/\&/

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

Соседние файлы в папке материалы к собеседованию