Регулярные выражения в UNIX |
Статьи - Основы UNIX |
Регулярные выражения UNIXРегулярные выражения (regular expressions) – система синтаксического разбора текстовых фрагментов по формализованному шаблону, основанная на системе записи образцов для поиска. Образец (pattern), задающий правило поиска, по-русски также иногда называют шаблоном или маской. Регулярные выражения произвели прорыв в электронной обработке текста в конце XX века. Сейчас регулярные выражения используются многими текстовыми редакторами и утилитами для поиска и изменения текста на основе выбранных правил. Многие языки программирования уже поддерживают регулярные выражения для работы со строками. Набор утилит (включая редактор sed и фильтр grep), поставляемых в дистрибутивах UNIX, одним из первых способствовал популяризации понятия регулярных выражений. Справочная страница (man re_format) содержит исчерпывающее описание регулярных выражений, соответствующих стандарту POSIX 1003.2. Символы базовых регулярных выраженийЗвездочка -- * --Означает любое количество символа в строке, предшествующего “звездочке”, в том числе и нулевое число символов. Точка -- . --Означает не менее одного любого символа Символ -- ^ --Означает начало строки, но иногда, в зависимости от контекста, означает отрицание в регулярных выражениях. $ grep '^s' /etc/passwd Знак доллара -- $ --В конце регулярного выражения соответствует концу строки. $ grep 'sh$' /etc/passwd Квадратные скобки -- [...] --Предназначены для задания подмножества символов. Квадратные скобки, внутри регулярного выражения, считаются одним символом, который может принимать значения, перечисленные внутри этих скобок. Метасимвол ^ означает отрицание множества $ grep '^[rt]' /etc/passwd Обратный слеш -- \ --Служит для экранирования специальных символов, это означает, что экранированные символы должны интерпретироваться буквально, т.е. как простые символы (в некоторых случаях наоборот). Экранированные "угловые скобки" -- \<...\> --Отмечают границы слова (не работает в sed). $ grep 'var' /etc/login.conf Экранированные "круглые скобки" -- \( \) --Предназначены для выделения групп регулярных выражений. Они полезны при использовании с оператором “\|” и при извлечении подстроки. $ grep 'daily\|weekly' /etc/crontab Экранированные "фигурные скобки" -- \{ \} --Задают число вхождений предыдущего выражения. $ grep '\(ro.*\)\{2\}' /etc/passwd Классы символов POSIX.[:class:] это альтернативный способ указания диапазона символов. $ grep '\<[[:alpha:]]\{X\}\>' /etc/login.conf Заменяем в файле catalog.txt пробел на TAB $ sed 's/\(.*\)[[:space:]].*[[:space:]]\(.*\)/\1 \2/' catalog.txt Символы расширенных регулярных выраженийМногие символы экранируемые в базовых выражениях – () {} | – но не – <> – используются без экранирования. Знак вопроса -- ? --Означает, что предыдущий символ или регулярное выражение встречается 0 или 1 раз. $ grep -E '^r?o' /etc/passwd Знак "плюс" -- + --Указывает на то, что предыдущий символ или выражение встречается 1 или более раз (добавляем произвольное количество символов разделителей в файл catalog.txt). $ sed -E 's/([[:alpha:]]+)[[:space:]]+.*[[:space:]]+ |