Regex 使用ACK作为过滤器

Regex 使用ACK作为过滤器,regex,shell,command-line,filter,ack,Regex,Shell,Command Line,Filter,Ack,我一直在用它来搜索我的代码库,这是一个很棒的工具。然而,在我看来,它有一个重要的限制——它不允许正则表达式的多行匹配 为了克服这个限制,我想过滤一组包含某个表达式的文件,然后再次过滤它们,寻找第二个表达式(假设两个表达式很可能不在同一行)。我尝试运行以下命令,但没有成功(它不返回任何结果): 我不想使用grep,因为我想将搜索限制在java文件上,忽略.cvs dirs、.svn dirs等(默认情况下,ack会做些什么)有什么想法吗?您当前的命令行正在文件列表上执行ack,而不是将匹配文件列表

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

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


我不想使用
grep
,因为我想将搜索限制在java文件上,忽略.cvs dirs、.svn dirs等(默认情况下,
ack
会做些什么)有什么想法吗?

您当前的命令行正在文件列表上执行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
标志告诉它期望文件名以空分隔

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