ack:通过正则表达式从搜索中排除特定目录

csc*_*hol 25 regex ack

如何通过带有ack的 RegEx忽略特定目录?

我可以使用该--ignore-dir选项,但这不允许我指定RegEx.我希望能够忽略任何目录,里面有句话testtests在其名称或更复杂的图案.

我也试过了一个负面的lookbehind via

ack -G '(?<!test)' pattern
Run Code Online (Sandbox Code Playgroud)

但这不起作用.它不排除test目录.

hol*_*eek 21

使用未记录的选项"--invert-file-match"(我系统上的ack版本:1.96):

$ ack pattern -G 'test|tests' --invert-file-match
Run Code Online (Sandbox Code Playgroud)

好吧,它有点记录:

$ ack --help|grep invert
-v, --invert-match    Invert match: select non-matching lines
--invert-file-match   Print/search handle files that do not match -g/-G.
Run Code Online (Sandbox Code Playgroud)

它的perldoc没有记录.


laj*_*rre 11

使用ack2,似乎你无法使用holygeek的解决方案.

这是我如何使用-v-x:

ack -v -g 'test' | ack -x pattern
Run Code Online (Sandbox Code Playgroud)

更一般地说,'test'可以是dirs排除的正则表达式


baj*_*aja 5

为了使用1.96之前版本的ack(像我一样)的人们的利益,你可以使用正则表达式环顾四周来做到这一点.这是一个例子:

ack --java 'text-pattern' -G '^((?!(test|target)).)*$'
Run Code Online (Sandbox Code Playgroud)

这将以递归方式(来自.)搜索text-pattern所有Java文件,这些文件中没有单词testtarget在其路径中.


jwd*_*jwd 5

在最新版本的 ack 中,您可以将正则表达式与--ignore-dir.

这个线程

是的,在 2.15_01 中我们添加了:

  • ack 现在支持 --ignore-dir=match:.... 谢谢,Ailin Nemui!(GitHub 票 #42)

GitHub 链接:https : //github.com/petdance/ack2/issues/42

可悲的是,我认为这仅支持匹配基本目录名称,而不支持完整路径。

例如,您无法匹配类似的路径".*/docs/generated/.*"

为此,请参阅GitHub 问题 291

2020 年更新:看起来现在已移至 ack3(github 问题)。