我一直在使用ACK用于搜索我的代码库,它是一个很棒的工具。然而,(在我看来)它有一个重要的限制 - 它不允许正则表达式的多行匹配。
为了克服这个限制,我想过滤一组包含特定表达式的文件,然后再次过滤它们以查找第二个表达式(假设两个表达式很可能不在同一行)。我尝试运行以下命令,但没有成功(它不返回任何内容):
ack -l --type=java "(List|Collection|Map|Set)" | ack --type=java "String"
而且我不想使用 grep
,因为我想将搜索限制为 java 文件,忽略 .cvs 目录、.svn 目录等(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
标志告诉它期望文件名以 null 分隔。
关于regex - 使用 ACK 作为过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7850743/