如何搜索文件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?
最简单的解决方案是通过链式调用应用渐进式过滤ack:
$ ack pattern1 | ack pattern2 | ack pattern3 | ...
Run Code Online (Sandbox Code Playgroud)
/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)