Как избежать PCRE паттерна с помощью bash (ag) - PullRequest
2 голосов
/ 03 мая 2019

Вопрос

Как мне избежать регулярного выражения (PCRE) для использования в bash (с ag )?

Попытка

ag (?!.*rib)(?=.*dist)^(\w+)$ # -bash: !.*wib: event not found
ag "(?!.*rib)(?=.*dist)^(\w+)$" # -bash: !.*wib: event not found
ag '(?!.*rib)(?=.*dist)^(\w+)$' # This does not crash, but finds nothing
ag (\?!.\*rib)(\?=.\*dist)^(\\w+)$ # -bash: !.*wib: event not found

Редактировать : Я ошибся - третий, приведенный выше, ничего не находит (но, похоже, задумывается)

Я использую OSX

$ bash -version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

А-а-а, это чертовы восклицательные знаки :-) Это сообщение "событие не найдено" из-за неоткрытого ! восклицательного знака. Попробуйте с какой-нибудь случайной строкой:

echo !asdjweuwioeuoiu 
# -bash: !asdjweuwioeuoiu: event not found

Но если вы укажете кавычки, его не следует расширять и интерпретировать с помощью bash:

echo '!fkj90eruge90ru0e9ger0g'
# !fkj90eruge90ru0e9ger0g

Итак, третья строка ваших предложений должна работать:

ag '(?!.*rib)(?=.*dist)^(\w+)$'
0 голосов
/ 01 июня 2019

Предположим, у вас есть файл 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.

...