如何使用 ack 查找包含两种模式的文件?

How can I use ack to find files that contain two patterns?

我正在尝试搜索包含 2 个模式的文件。我猜管道是要走的路,但我做错了什么,因为以下不起作用:

ack -l "pattern1" | ack -l "pattern2"

我错过了什么?

更新:如果目的是在文件中找到两种模式任何地方(不一定在同一个行)Andy Lester's answer 提供了简单的解决方案


-l 输出 filename 而不是匹配的 line(s),所以不要使用 -l 在你的 first ack 调用中(否则第二个将只接收文件名作为其输入)。

然而,正如@Mr. Llama 正确地指出,即使那样也行不通,因为第二个 ack 会在匹配的情况下打印 - (stdin),因为它的输入来自 管道 而不是 文件 .

ack "pattern1" | ack -l "pattern2" # !! prints '-' in case of match

通常,-l 仅对 filenames 作为操作数才有意义。

然而,除此之外,你的命令只有在(至少一个)行包含两者[=50=时才会匹配] 搜索字词.

如果这确实是意图,您可以通过 单次 调用 ack,使用正则表达式交替(括号用于视觉清晰度,并非绝对必要):

ack -l "(pattern1).*(pattern2)|(pattern2).*(pattern1)" file

我从你的问题中了解到,你想要包含 pattern1 和 pattern2 的文件,即使它们在不同的行上。

这是一种方法:

ack -l pattern2 $(ack -l pattern1)

这是另一个:

ack -l pattern1 | ack -l -x pattern2

-x 表示 "Get the list of files to search from standard input, as if I were the xargs program."(假设您使用的是 ack 2.x 或更高版本)