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

caj*_*ine 3 regex perl ack

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

任何一个(OR)是很容易,比如:

ack 'pattern1|pattern2|pattern3'
Run Code Online (Sandbox Code Playgroud)

但如何写AND(ALL)?例如,如何写以下内容:

if( $line =~ /pattern1/ && $line =~ /pattern2/ && $line =~ /pattern3/ ) {
    say $line
}
Run Code Online (Sandbox Code Playgroud)

ack

或者更确切地说,有可能创建一个正则表达式logical and

amp*_*ine 5

最简单的解决方案是通过链式调用应用渐进式过滤ack

$ ack pattern1 | ack pattern2 | ack pattern3 | ...
Run Code Online (Sandbox Code Playgroud)


ike*_*ami 5

 /foo/s && /bar/s && /baz/s
Run Code Online (Sandbox Code Playgroud)

可写成

 /^(?=.*?foo)(?=.*?bar)(?=.*?baz)/s
Run Code Online (Sandbox Code Playgroud)

我们实际上并不需要预测最后一个.

 /^(?=.*?foo)(?=.*?bar).*?baz/s
Run Code Online (Sandbox Code Playgroud)

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

 /^(?=.*foo)(?=.*bar).*baz/s
Run Code Online (Sandbox Code Playgroud)