ack - 搜索多个模式(逻辑与)

ack - search for multiple patterns (logical AND)

如何使用 ack 搜索文件以查找包含 ALL(或任何)已定义模式的行?

ANY (OR) 很简单,例如:

ack 'pattern1|pattern2|pattern3'

但是 AND (ALL) 怎么写呢?例如怎么写:

if( $line =~ /pattern1/ && $line =~ /pattern2/ && $line =~ /pattern3/ ) {
    say $line
}

使用 ack?

或者更准确地说,是否可以使用 logical and 创建正则表达式?

最简单的解决方案是通过对 ack:

的链式调用应用渐进式过滤
$ ack pattern1 | ack pattern2 | ack pattern3 | ...
 /foo/s && /bar/s && /baz/s

可以写成

 /^(?=.*?foo)(?=.*?bar)(?=.*?baz)/s

实际上我们不需要提前看最后一个。

 /^(?=.*?foo)(?=.*?bar).*?baz/s

并且由于我们不关心模式的哪个实例匹配,如果有多个实例,我们可以将其简化为

 /^(?=.*foo)(?=.*bar).*baz/s

我有一个类似的用例,我想找到包含多个模式但(可能)在不同行的文件。

ack -l 'pattern1' | ack -xl 'pattern2'

这使我能够找到同时使用 2 个库的文件。