2

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

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

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

而且我宁愿不使用grep,因为我想将搜索限制在 java 文件中,忽略 .cvs 目录、.svn 目录等(ack默认情况下会这样做)有什么想法吗?

4

1 回答 1

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标志告诉它期望文件名是空分隔的。

于 2011-10-21T14:44:09.267 回答