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

7

如何使用 ack 搜索文件以查找包含全部(而非任意)定义模式的行?

任意一个(或)很容易,例如:

ack 'pattern1|pattern2|pattern3'

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

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

使用 ack

更准确地说,是否可以使用 逻辑与 创建正则表达式?

3个回答

6
 /foo/s && /bar/s && /baz/s

可以写成

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

我们实际上不需要对最后一个进行前瞻。
 /^(?=.*?foo)(?=.*?bar).*?baz/s

如果有多个匹配模式的实例,我们不关心匹配哪一个实例,因此可以简化为:

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

谢谢!另外:真的没有更简单的选择吗? - user2305193

5

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

$ ack pattern1 | ack pattern2 | ack pattern3 | ...

是的 ;) 这也可以通过 grep 实现。不可能在一个 ack 运行中实现吗?例如,Perl 正则表达式不知道 AND 这样的东西吗? - cajwine
1
正则表达式是模式匹配,而不是逻辑操作。稍微严谨一点:在正则表达式中,“|”表示“选择”,而不是“或”。没有元字符表示“与”,因为这是默认的隐含操作。例如,模式“ab”要求匹配字符“a”和字符“b”(按顺序相邻)。匹配多个模式要么进行多次匹配(如amphetamachine的答案),要么将模式合并成一个单一的模式(如ikegami的答案)。 - Michael Carman

3

我曾经遇到过一个类似的用例,我希望能够找到包含多个模式但可能在不同行上的文件。

ack -l '模式1' | ack -xl '模式2'

这样可以让我找到同时使用两个库的文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接