Использование обратных ссылок
Существует специальная конструкция, позволяющая в регулярном выражении обращаться к уже найденной с помощью символов группировки подстроке. Она называется обратной ссылкой (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; просмотров: 669;