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 个库的文件。
如何使用 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 个库的文件。