如何使用 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 或更高版本)
我正在尝试搜索包含 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 或更高版本)