【问题标题】:ack - search for multiple patterns (logical AND)ack - 搜索多个模式(逻辑与)
【发布时间】:2016-03-28 16:59:31
【问题描述】:

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

ANY (OR) 很简单,比如:

ack 'pattern1|pattern2|pattern3'

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

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

使用ack?

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

【问题讨论】:

    标签: regex perl ack


    【解决方案1】:
     /foo/s && /bar/s && /baz/s
    

    可以写成

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

    我们实际上不需要对最后一个进行展望。

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

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

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

    【讨论】:

    • 谢谢!另外:真的没有更简单的选择吗?
    【解决方案2】:

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

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

    【讨论】:

    • yes ;) grep 也可以。在一次 ack 运行中不可能吗? - 例如perl-regexes 不知道 AND?
    • @cajwine:正则表达式做模式,而不是逻辑。有点迂腐:在正则表达式中,| 表示“交替”,而不是“或”。 “and”没有元字符,因为这是隐含的默认值。例如模式ab 需要匹配字符“a”和字符“b”(按此顺序,并且彼此相邻)。匹配多个模式需要多个匹配项(如 amphetamachine 的答案)或将模式合并为一个(如 ikegami 的答案)。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多