如何获得一个支持负回溯断言的GNU grep等效工具的最简单方法?

19

我正在尝试在嵌套的子目录中 grep 一堆文件以查找正则表达式匹配项;我的正则表达式需要负向回顾。

Perl 有负向回顾,但据我所知,GNU grep 不支持负向回顾

有没有最简单的方法来获取与支持负向回顾等效的 GNU grep?

(我想我可以在 Perl 中编写自己的 mini-grep,但这似乎不应该是必需的。我的 Perl Cookbook 包括 tcgrep 的源代码;我应该使用它吗?如果是,则最新版本在哪里?不要告诉我我必须键入整个程序!)

2个回答

24

使用 ack!Ack是用Perl写的,因此默认情况下使用Perl的正则表达式引擎。

负回顾后发现是ack "(?<!bad)boy"(参考willert的评论)。


1
我认为有人可能会建议这样做,但我不认为ack使用负回顾。例如,我在临时目录中创建了一个包含两行“好孩子”和“坏孩子”的临时文件,然后使用Perl in a Nutshell中的示例:ack“(?<!=bad)boy” …它返回了两行。如果遵循正则表达式,只有“好孩子”一行应该返回。(如果你最终是正确的话,我会取消我的反对票。) - Dan Fabulich
4
负回顾后发断言是<code>ack "(?<!bad)boy"</code>,用<code>=</code>来跳过。 - willert
WTF?“投票太旧无法更改,除非编辑此答案。” @太多的PHP,请进行编辑,我会修复它,抱歉。 :-( - Dan Fabulich
! in ack "(?<!bad)boy" will be intercepted by bash (bash: !bad: event not found), use single quotes ack '(?<!bad)boy' - user1472229

3

感谢其他问题中的评论。我发现在grep中实验性地支持负回顾前缀,并且可以使用-P/--perl-regexp选项,因此如果您喜欢继续使用grep,则可能仍然不需要使用其他工具。

顺便说一句,我更喜欢的替代grepgrin(用Python编写)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接