我一直在使用ACK来搜索我的代码库,这是一个很棒的工具。但是,它(在我看来)有一个重要的限制 - 它不允许正则表达式的多行匹配。
为了克服这个限制,我想过滤一组包含某个表达式的文件,然后再次过滤它们寻找第二个表达式(假设两个表达式很可能不在同一行上)。我已经尝试运行以下命令,但没有成功(它什么都不返回):
ack -l --type=java "(List|Collection|Map|Set)" | ack --type=java "String"
而且我宁愿不使用grep
,因为我想限制我的搜索到java文件,忽略.cvs dirs,.svn dirs等(默认情况下ack
会执行)想法?
答案 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
标志告诉它期望文件名为空分隔。