2

问题

如何转义正则表达式(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.
4

2 回答 2

2

啊,这些是该死的感叹号 :-) 由于未转义的!感叹号,此消息“未找到事件”。尝试使用一些随机字符串:

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

但是如果你用引号转义,它不应该被 bash 扩展和解释:

echo '!fkj90eruge90ru0e9ger0g'
# !fkj90eruge90ru0e9ger0g

因此,您的建议的第三行应该有效:

ag '(?!.*rib)(?=.*dist)^(\w+)$'
于 2019-05-03T11:32:19.980 回答
0

假设您有一个文件 foo.txt,其中包含以下四行文本:

distribute
distrib
distrubte
dist

然后使用 bash 中的 ag,您将使用正则表达式,如下所示:

$ ag "(?\!.*rib)(?=.*dist)" foo.txt
3:distrubte
4:dist

第 3 行和第 4 行将作为找到的匹配项返回。注意:我使用了双引号,而不是单引号,并且只转义了感叹号——因为我不希望它被 bash 解释,而是在正则表达式中使用。如果我想使用它,我可以这样做:

$echo dist
dist
$ag "!$$" foo.txt 
4:dist

现在第四行匹配了。这里发生的事情是!$!$$shell 扩展为上一个命令的最后一个参数,即dist. 并且,最后$保留为文字,使扩展命令ag "dist$",这与文件中的第四行匹配。

出于这个原因,我实际上更喜欢使用/使用双引号,因为它们提供了将变量、参数和 shell 功能交换到 Ag 的搜索字符串中的能力。YMMV。

于 2019-06-01T19:43:27.693 回答