Существует специальная конструкция, позволяющая в регулярном выражении обращаться к уже найденной с помощью символов группировки подстроке. Она называется обратной ссылкой (back reference) и записывается так: \1, что значит повтор строки, удовлетворившей регулярному выражению — группи- ровке, которое было указано в регулярном выражении до вхождения символа обратной ссылки. Например, требуется получить список всех пользователей системы, у которых имя (первое поле /etc/passwd) совпадает с именем испол- няемого файла оболочки (последнее поле /etc/passwd). Такую задачу можно решить, используя обратную ссылку (пример 9.12).
Пример 9.12. Поиск с обратной ссылкой с помощью egrep
В этом регулярном выражении шаблоном для имени пользователя является
^(.+):, т. е. строка из ненулевого количества любых символов. При этом специально использован символ группирования, т. к. с помощью него запо- минается строка символов, соответствующая имени пользователя. Далее эта же найденная строка с помощью обратной ссылки \1 сравнивается с именем файла оболочки.
Вообще говоря, приведенный пример 9.12 не будет работать в других опера- ционных системах, если в них не используется GNU-версия grep. Это связано с концептуальной невозможностью использования обратных ссылок в про- граммах поиска подстрок, реализующих расширенный синтаксис регулярных выражений. GNU-версия egrep (он же grep) обеспечивает возможность по- иска строк с использованием обратных ссылок.
Далее приведен более корректный пример 9.13, который не использует
egrep.
Пример 9.13. Поиск с обратной ссылкой с помощью grep
В регулярном выражении может быть задано более одного символа обратной ссылки. Если используется более одной обратной ссылки, то должно быть указано несколько символов группировки, а номера у обратных ссылок должны соответствовать порядковым номерам вхождений символов группи- ровки в регулярном выражении.
Например, требуется получить список всех IP-адресов и имен хостов из фай- ла /etc/hosts (который связывает IP-адрес и имя компьютера в сети) только для тех хостов, чьи IP-адреса начинаются либо со 127, либо со 192 (при- мер 9.14). Кроме того, у этих хостов должны быть одновременно указаны полностью определенное доменное имя (Fully Qualified Domain Name, FQDN) и короткое имя (или наоборот — порядок не важен).
Пример 9.14. Использование нескольких обратных ссылок
В примере 9.14 первый символ группирования предназначен для организации перечисления (инфиксного оператора ИЛИ), а второй — для организации поиска по обратной ссылке. Так как искомые имена компьютеров могут быть определены по второму символу группирования, то используется оператор обратной ссылки \2.