booksdaily.club
booksdaily.club » Компьютеры и Интернет » ОС и Сети » UNIX — универсальная среда программирования - Керниган Брайан Уилсон

UNIX — универсальная среда программирования - Керниган Брайан Уилсон

На этом ресурсе Вы можете бесплатно читать книгу онлайн UNIX — универсальная среда программирования - Керниган Брайан Уилсон. Жанр: ОС и Сети / Интернет . На сайте booksdaily.club Вы можете онлайн читать полную версию книги без регистрации и sms. Так же Вы можете ознакомится с содержанием, описанием, предисловием о произведении
Перейти на страницу:

Во всех рассматривавшихся до сих пор примерах проводился поиск обычных строк из букв и чисел. Но команда

grep
может искать и более сложные шаблоны: она интерпретирует выражения согласно простому языку для описания строк. С технической точки зрения шаблон представляет в некоторой степени ограниченную форму спецификаций строк, называемую регулярным выражением. Команда интерпретирует такие же регулярные выражения, как и редактор
ed
. На самом деле, эта команда была создана (за один вечер) прямым редактированием
ed
.

Регулярные выражения характеризуются тем, что ряду символов, таким, как

*
и т.п., приписывается специальное значение, используемое интерпретатором. Есть еще несколько метасимволов, но, к сожалению, с различными значениями. В табл. 4.1 показаны все метасимволы регулярных выражений, и мы кратко их здесь рассмотрим.

с
Любой неспециальный символ c соответствует самому себе
c
Указание убрать любое специальное значение символа
c
^
Начало строки
$
Конец строки
.
Любой одиночный символ
[...]
Любой символ из
...;
допустимы диапазоны типа
a-z
[^...]
Любой символ не из
...
; допустимы диапазоны
n
Строка, соответствующая n-му выражению
(...)
(только для
grep
)
r*
Нуль или более вхождений
r
r+
Одно или более вхождений
r
(только для egrep)
r?
Нуль или одно вхождение
r
(только для egrep)
r1r2
За
r1
следует
r2
r1|r2
r1
или
r2
(только для egrep)
(r)
Помеченное регулярное выражение
r
(только для
grep
); может быть вложенным
(r)
Регулярное выражение
r
(только
для
grep); может быть вложенным
Никакое регулярное выражение не соответствует концу строки

Таблица 4.1: Регулярные выражения

grep
и
egrep
(в порядке убывания приоритета)

Метасимволы

^
и
$
привязывают шаблон к началу (
^
) или концу (
$
) строки. Например,

$ grep From $MAIL

ищет строки, содержащие

From
в вашей почтовой посылке, но

$ grep '^From' $MAIL

выдает строки, начинающиеся с

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

Команда

grep
допускает классы символов, подобные тем, что используются интерпретатором: так,
[a-z]
задает любую строчную букву. Но есть и различия — если класс символов команды
grep
начинается с символа слабого ударения то шаблон задает любой символ, кроме входящих в данный класс. Значит,
[^0-9]
задает любой символ, кроме цифры. Как и в интерпретаторе, обратная дробная черта экранирует символы
]
и
-
в классе символов, но команды
grep
и
ed
требуют, чтобы эти символы использовались там, где их значение недвусмысленно. Например, шаблон
[][-]
задает открывающую или закрывающую квадратную скобку либо знак минус.

Точка

'.'
эквивалентна
'?'
в интерпретаторе: она задает любой символ. (Точка, по всей видимости, есть символ, назначение которого различно для разных программ.) Ниже приводятся два примера:

$ ls -l | grep '^d'        
Список имен вложенных каталогов

$ ls -l | grep '^.......rw'
Список файлов, доступных всем для чтения и записи

Символ

'^'
и семь точек задают любые семь символов в начале строки; в случае применения к выходному потоку команды
ls -l
задается любая строка права доступа.

Операция "повторитель" (

'*'
) применима в выражении к предваряющему ее символу или метасимволу (включая класс символов), и вместе они обозначают любое число вхождений символа или метасимвола. Например,
x*
задает последовательность букв
x
произвольной длины,
[a-zA-Z]*
— любую строку букв,
.*
— все до конца строки, а
.*x
— все до последнего символа
x
в строке включительно. Необходимо отметить несколько важных моментов, связанных с повторителем. Во-первых, повторитель действует только на один символ, поэтому
xy*
соответствует
x
, за которым идут
yy...
, но не последовательности типа
xyxyxy
. Во-вторых, любое число включает нуль, поэтому если вы хотите, чтобы символ присутствовал, в шаблоне его нужно повторить. Например, правильным выражением, задающим строку букв, является такое:
[a-zA-Z][a-zA-Z]*
(буква, за которой следует нуль или более букв). Регулярное выражение
.*
соответствует —
*
, т.е. метасимволу интерпретатора, используемому для имен файлов.

Перейти на страницу:

Керниган Брайан Уилсон читать все книги автора по порядку

Керниган Брайан Уилсон - на сайте онлайн книг booksdaily.club Вы можете читать полные версии книг автора в одном месте.


UNIX — универсальная среда программирования отзывы

Отзывы читателей о книге UNIX — универсальная среда программирования, автор: Керниган Брайан Уилсон. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор booksdaily.club


Прокомментировать
Подтвердите что вы не робот:*