Предположим, у вас есть файл foo.txt с четырьмя строками следующего текста:
distribute
distrib
distrubte
dist
Затем, используя ag из bash, вы будете использовать свое регулярное выражение следующим образом:
$ ag "(?\!.*rib)(?=.*dist)" foo.txt
3:distrubte
4:dist
Строки 3 и 4 вернутся как найденные совпадения.Примечание: я использовал двойные кавычки, а не одинарные и ТОЛЬКО избежал восклицательного знака - так как я не хотел, чтобы он интерпретировался bash, но использовался в регулярном выражении.Если бы я хотел, чтобы это использовалось, я мог бы сделать что-то вроде этого:
$echo dist
dist
$ag "!$$" foo.txt
4:dist
Теперь четвертая строка совпадает.Здесь произошло то, что !$
из !$$
было расширено оболочкой как последний аргумент предыдущей команды, то есть dist
.И, окончательный $
был оставлен как литерал, создавая расширенную команду ag "dist$"
, и это соответствует четвертой строке в файле.
По этой причине я на самом деле предпочитаю использовать / бороться с двойными кавычками, поскольку они дают возможность обмениваться переменными, аргументами и возможностями оболочки в поисковой строке Ag.YMMV.