Использование обратных ссылок

Существует специальная конструкция, позволяющая в регулярном выражении обращаться к уже найденной с помощью символов группировки подстроке. Она называется обратной ссылкой (back reference) и записывается так: \1, что значит повтор строки, удовлетворившей регулярному выражению — группи- ровке, которое было указано в регулярном выражении до вхождения символа обратной ссылки. Например, требуется получить список всех пользователей системы, у которых имя (первое поле /etc/passwd) совпадает с именем испол- няемого файла оболочки (последнее поле /etc/passwd). Такую задачу можно решить, используя обратную ссылку (пример 9.12).

 

Пример 9.12. Поиск с обратной ссылкой с помощью egrep

 

$ egrep '^(.+):.*\1$' /etc/passwd sync:x:5:0:sync:/:/bin/sync shutdown:x:6:0:shutdown:/:/sbin/shutdown halt:x:7:0:halt:/:/sbin/halt


 

В этом регулярном выражении шаблоном для имени пользователя является

^(.+):, т. е. строка из ненулевого количества любых символов. При этом специально использован символ группирования, т. к. с помощью него запо- минается строка символов, соответствующая имени пользователя. Далее эта же найденная строка с помощью обратной ссылки \1 сравнивается с именем файла оболочки.

Вообще говоря, приведенный пример 9.12 не будет работать в других опера- ционных системах, если в них не используется GNU-версия grep. Это связано с концептуальной невозможностью использования обратных ссылок в про- граммах поиска подстрок, реализующих расширенный синтаксис регулярных выражений. GNU-версия egrep (он же grep) обеспечивает возможность по- иска строк с использованием обратных ссылок.

Далее приведен более корректный пример 9.13, который не использует

egrep.

 

Пример 9.13. Поиск с обратной ссылкой с помощью grep

 

$ grep '^\(..*\):.*\1$' /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt

 

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

Например, требуется получить список всех IP-адресов и имен хостов из фай- ла /etc/hosts (который связывает IP-адрес и имя компьютера в сети) только для тех хостов, чьи IP-адреса начинаются либо со 127, либо со 192 (при- мер 9.14). Кроме того, у этих хостов должны быть одновременно указаны полностью определенное доменное имя (Fully Qualified Domain Name, FQDN) и короткое имя (или наоборот — порядок не важен).

 

Пример 9.14. Использование нескольких обратных ссылок

 

$ egrep '^(192|127)\..*([[:alnum:]]+)\..*\2$' /etc/hosts

127.1.1.1 localhost.localdomain localhost


 

В примере 9.14 первый символ группирования предназначен для организации перечисления (инфиксного оператора ИЛИ), а второй — для организации поиска по обратной ссылке. Так как искомые имена компьютеров могут быть определены по второму символу группирования, то используется оператор обратной ссылки \2.

 








Дата добавления: 2015-06-12; просмотров: 675;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.