【问题标题】:Get lines between pattern1 OR get lines that match pattern2 - sed/awk获取 pattern1 之间的行或获取匹配 pattern2 的行 - sed/awk
【发布时间】:2016-05-03 15:29:59
【问题描述】:

我有一个格式为:

PATTERN2
PATTERN1
text I want
more text I want ...
PATTERN1
text don't want
text don't want
text don't want
PATTERN2
PATTERN1
text I want
more text I want ...
PATTERN1
text don't want
text don't want
text don't want
...

我可以使用 sed 获取 PATTERN1 出现之间的文本。

sed -n -e '/PATTERN1/,/PATTERN1/ p' my_file.txt

我也可以得到匹配 PATTERN2 的行。

sed -n -e '/PATTERN2/ p' my_file.txt

但是,我无法获得与这些模式中的任何一个匹配的行。我想要的输出是

PATTERN2
PATTERN1
text I want
more text I want ...
PATTERN1
PATTERN2
PATTERN1
text I want
more text I want ...
PATTERN1

感谢您的帮助。

【问题讨论】:

    标签: regex awk sed


    【解决方案1】:

    您可以将两个-e 命令附加在一起。它将为每一行都执行它们

    sed -n -e '/PATTERN1/,/PATTERN1/ p' -e '/PATTERN2/ p' my_file.txt
    

    注意:如果/PATTERN2//PATTERN1/ 内部匹配,则该行将被打印两次

    还有一个更复杂的sed命令可以解决上面的警告:

    sed -e '/PATTERN1/,/PATTERN1/ !{
        /PATTERN2/ !d
    }'
    

    在标记之间不执行删除除 PATTERN2 之外的所有内容。换句话说,在标记之外,删除除 PATTERN2 之外的所有内容。

    【讨论】:

      【解决方案2】:

      你可以使用这个 awk 命令:

      awk '/PATTERN1/{p=!p} p || /PATTERN1|PATTERN2/' file
      
      PATTERN2
      PATTERN1
      text I want
      more text I want ...
      PATTERN1
      PATTERN2
      PATTERN1
      text I want
      more text I want ...
      PATTERN1
      

      【讨论】:

        【解决方案3】:

        为了可维护性,切勿多次测试相同的硬编码值(例如PATTERN1):

        $ awk '/PATTERN1/{if (f) print; f=!f} f || /PATTERN2/' file
        PATTERN2
        PATTERN1
        text I want
        more text I want ...
        PATTERN1
        PATTERN2
        PATTERN1
        text I want
        more text I want ...
        PATTERN1
        

        如果您以后想用FOO 替换PATTERN1,那么使用上面的代码,您只需在一个地方进行更改。

        【讨论】:

          【解决方案4】:

          一个易于阅读的 sed 版本:

          sed -n "/PATTERN2/p;/PATTERN1/,/PATTERN1/p"
          

          我希望这会有所帮助。

          • -n 默认不打印
          • /PATTERN2/单数匹配字符串
          • 打印出来
          • /PATTERN1/ 第一个匹配字符串
          • ,之间的一切
          • /PATTERN1/第二个匹配字符串
          • 打印出来

          【讨论】:

            猜你喜欢
            • 2012-06-13
            • 2020-12-21
            • 1970-01-01
            • 1970-01-01
            • 2011-12-26
            • 1970-01-01
            • 2013-11-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多