Чтение онлайн

на главную - закладки

Жанры

Командная строка Linux
Шрифт:

[me@linuxbox ~]$ echo "AAA" | grep -E 'AAA|BBB|CCC'

AAA

Для объединения с другими элементами регулярного выражения чередование можно заключать в круглые скобки :

[me@linuxbox ~]$ grep -Eh '^(bz|gz|zip)' dirlist*.txt

Этому выражению будут соответствовать имена файлов из наших списков, начинающиеся с bz, gz или zip. Если отбросить круглые скобки, смысл регулярного выражения изменится, и ему будут соответствовать имена, начинающиеся с bz или содержащие gz или zip:

[me@linuxbox ~]$ grep -Eh '^bz|gz|zip' dirlist*.txt

Квантификаторы

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

? — совпадение с элементом ноль или один раз

Этот квантификатор фактически означает: «совпадение с предыдущим элементом не обязательно». Представьте, что нужно проверить допустимость номера телефона, и предполагается, что номер допустим, если представлен в одной из двух форм: (nnn) nnn-nnnn или nnn nnn-nnnn, где n — это цифра. Для проверки можно было бы использовать следующее регулярное выражение:

^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$

В этом выражении за круглыми скобками следуют знаки вопроса, указывающие, что скобки могут либо отсутствовать, либо присутствовать один раз. И снова, поскольку круглые скобки считаются метасимволами (в ERE), мы экранировали их обратными слешами, чтобы они интерпретировались как литералы.

Попробуем применить это выражение:

[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]$'

(555) 123-4567

[me@linuxbox ~]$ echo "555 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'

555 123-4567

[me@linuxbox ~]$ echo "AAA 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'

[me@linuxbox ~]$

Здесь регулярному выражению соответствуют обе формы записи номера телефона, но ему не соответствует номер, содержащий нецифровые символы.

* — совпадение с элементом ноль или более раз

Подобно метасимволу ?, звездочка (*) обозначает необязательный элемент; однако, в отличие от знака вопроса (?), этот элемент может встречаться любое число раз, а не только единожды. Представьте, что нам нужно проверить, является ли строка предложением. Чтобы удовлетворять нашим требованиям строка должна начинаться с большой буквы, содержать любое число букв верхнего и нижнего регистра и пробелов и заканчиваться точкой. Для поиска совпадений с этим (очень приблизительным) определением предложения воспользуемся следующим регулярным выражением:

[[:upper:]][[:upper:][:lower:] ]*\.

Выражение состоит из трех элементов: выражение в квадратных скобках с классом символов [:upper:], выражение в квадратных скобках с двумя классами символов, [:upper:] и [:lower:], и пробелом, и точка, экранированная обратным слешем. Второй элемент сопровождается метасимволом *, поэтому в нашем предложении ему может соответствовать любое число букв верхнего и нижнего регистра и пробелов, следующих за первой буквой верхнего регистра:

[me@linuxbox ~]$ echo "This works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'

This works.

[me@linuxbox ~]$ echo "This Works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'

This Works.

[me@linuxbox ~]$ echo "this does not" | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'

[me@linuxbox ~]$

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

+ — совпадение с элементом один или более раз

Метасимвол + действует почти так же, как *, но требует совпадения с предыдущим элементом не менее одного раза. Следующему регулярному выражению будут соответствовать только строки, состоящие из групп, насчитывающих один или несколько алфавитных символов и разделенных одиночными пробелами:

^([[:alpha:]]+ ?)+$

Опробуем его:

[me@linuxbox ~]$ echo "This that" | grep -E '^([[:alpha:]]+ ?)+$'

This that

[me@linuxbox ~]$ echo "a b c" | grep -E '^([[:alpha:]]+ ?)+$'

a b c

[me@linuxbox ~]$ echo "a b 9" | grep -E '^([[:alpha:]]+ ?)+$'

[me@linuxbox ~]$ echo "abc d" | grep -E '^([[:alpha:]]+ ?)+$'

[me@linuxbox ~]$

Как видите, этому выражению не соответствует строка "a b 9", потому что она содержит неалфавитный символ; точно так же ему не соответствует строка "abc d", потому что между символами c и d в ней присутствует больше одного пробела.

{ } — совпадение с элементом определенное число раз

Метасимволы { и } используются, чтобы выразить минимальное и максимальное число обязательных совпадений. Эти числа можно представить четырьмя возможными способами, как показано в табл. 19.3.

Таблица 19.3. Определение числа совпадений

Спецификатор

Значение

{n}

Предыдущий элемент соответствует, если встречается точно n раз

{n,m}

Предыдущий элемент соответствует, если встречается не менее n и не более m раз

Поделиться:
Популярные книги

Петр III

Сахаров Андрей Николаевич
12. Романовы. Династия в романах
Проза:
историческая проза
5.00
рейтинг книги
Петр III

Принадлежать им

Зайцева Мария
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Принадлежать им

Город гибели

МакКаммон Роберт Рик
Фантастика:
ужасы и мистика
мистика
7.78
рейтинг книги
Город гибели

Путь Князя. Возрождение. Часть I

Рокотов Алексей
6. Путь князя
Фантастика:
рпг
попаданцы
5.00
рейтинг книги
Путь Князя. Возрождение. Часть I

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Невольничий караван

Май Карл Фридрих
Приключения:
прочие приключения
6.83
рейтинг книги
Невольничий караван

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Газлайтер. Том 17

Володин Григорий Григорьевич
17. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 17

Глобальный человейник

Зиновьев Александр Александрович
Документальная литература:
критика
прочая документальная литература
публицистика
6.40
рейтинг книги
Глобальный человейник

Клинок Судеб

Глушков Владислав
Проза:
современная проза
5.75
рейтинг книги
Клинок Судеб

Шайтан Иван

Тен Эдуард
1. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Шайтан Иван

Студиозус 2

Шмаков Алексей Семенович
4. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
6.25
рейтинг книги
Студиозус 2

Темные тропы и светлые дела

Владимиров Денис
3. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Темные тропы и светлые дела