【问题标题】:Using sed/awk to print lines with matching pattern OR another matching pattern使用 sed/awk 打印具有匹配模式或其他匹配模式的行
【发布时间】:2011-07-20 02:31:41
【问题描述】:

我需要使用 在与模式不同模式匹配的文件中打印行。我觉得这是一项简单的任务,但我似乎无法找到答案。有什么想法吗?

【问题讨论】:

    标签: awk sed bash sed awk


    【解决方案1】:

    POSIX 方式

    awk '/pattern1/ || /pattern2/{print}'
    

    编辑

    公平地说,我更喜欢 lhf 通过/pattern1|pattern2/ 提供的方式,因为它需要更少的输入来获得相同的结果。但是,我应该指出,这个模板不能用于逻辑与操作,因为你需要使用我的模板/pattern1/ && /pattern2/

    【讨论】:

    • 谢谢,效果很好。我永远无法弄清楚 sed 或 awk 是否适合给定任务。我有什么大的不同吗?或不同的方式来做同样的事情?
    • @rick,是的。 awk 是一种编程语言。 sed 并不是那么实际。 (虽然它的图灵完成了)。
    • @rick 我通常只使用sed 进行简单的文本替换,如s/foo/bar/g 或者你有什么。对于您只想打印给定行的一部分的情况,对于大多数应用程序,我通常会使用awk,尽管sed 可以通过一些正则表达式来强制执行。如果您遇到任何处理任何“字段”意义的问题,无论分隔符是什么,在这种情况下,您几乎总是希望使用awk。此外,将awk 的输出通过管道传输到grep 是不正确的,反之亦然。你总是可以在awk 中组合这两个。
    【解决方案2】:

    用途:

    sed -nr '/patt1|patt2/p'
    

    其中patt1patt2 是模式。如果您希望它们匹配整行,请使用:

    sed -nr '/^(patt1|patt2)$/p'
    

    您可以删除-r 并添加转义:

    sed -n '/^\(patt1\|patt2\)$/p'
    

    为了符合 POSIX。

    【讨论】:

      【解决方案3】:

      你为什么不想使用 grep?

      grep -e 'pattern1' -e 'pattern2'
      

      【讨论】:

      • 一个可能的原因是“-P 选项仅支持单一模式”,因此如果有多个-es,您将无法使用 Perl RegExp,例如 GNU 的 Grep 的 \d。
      • egrep 'pattern1|pattern2'这样的东西怎么样?
      【解决方案4】:

      awk '/PATT1|PATT2/ { print }'

      【讨论】:

        猜你喜欢
        • 2013-07-28
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2017-02-23
        相关资源
        最近更新 更多