使用ACK作为过滤器

时间:2011-10-21 14:18:37

标签: regex shell command-line filter ack

我一直在使用ACK来搜索我的代码库,这是一个很棒的工具。但是,它(在我看来)有一个重要的限制 - 它不允许正则表达式的多行匹配。

为了克服这个限制,我想过滤一组包含某个表达式的文件,然后再次过滤它们寻找第二个表达式(假设两个表达式很可能不在同一行上)。我已经尝试运行以下命令,但没有成功(它什么都不返回):

ack -l --type=java "(List|Collection|Map|Set)" | ack --type=java "String"

而且我宁愿不使用grep,因为我想限制我的搜索到java文件,忽略.cvs dirs,.svn dirs等(默认情况下ack会执行)想法?

1 个答案:

答案 0 :(得分:4)

您当前的命令行正在文件列表上执行ack,而不是使用匹配文件列表作为要检查的另一组文件。也就是说,它与做

相同
ack -l --type=java "(List|Collection|Map|Set)" > files
ack "String" files

xargs是您要用来将第一个命令的输出视为可以运行第二个ack调用的一组文件的工具。

ack --print0 -l --type=java "(List|Collection|Map|Set)" | xargs -0 ack "String"

--print0将文件名用空字符分隔,以确保xargs获得正确的文件名(如果文件中有奇数字符)。 xargs的-0标志告诉它期望文件名为空分隔。