【问题标题】:How to select all text between two patterns where the end pattern might also be a start pattern如何选择两个模式之间的所有文本,其中结束模式也可能是开始模式
【发布时间】:2016-03-25 19:05:22
【问题描述】:

假设我有以下文件

BREAK A
abc
BREAK B
bcd
BREAK A
cde
BREAK A

我想做的是选择BREAK ABREAK 之间的所有内容,包括BREAK A 行,因此所需的输出是

BREAK A
abc
BREAK A
cde
BREAK A

我能找到的所有 awk 样本都没有说明我可能使用同一行作为匹配段的开始和结束的可能性。

附:我不确定这是否重要,但在实际文件中BREAK 出现在行首,而AB 出现在行中间。

【问题讨论】:

    标签: shell awk pattern-matching


    【解决方案1】:

    你可以使用:

    awk '/^BREAK/ && !/^BREAK A/{p=0} /^BREAK A/{p=1} p' file
    
    BREAK A
    abc
    BREAK A
    cde
    BREAK A
    

    我们使用p 作为切换值,当我们在一行中找到BREAK A 时设置该值,并在一行中找到任何其他BREAK 时重置。

    【讨论】:

    • 工作就像一个魅力。谢谢!
    【解决方案2】:

    使用 sed :

    $ sed '/BREAK [^A]/,/BREAK A/{/BREAK A/!d}' file
    BREAK A
    abc
    BREAK A
    cde
    BREAK A
    

    【讨论】:

      【解决方案3】:

      首先它表示包含正则表达式“BREAK A”的打印行,分号用作语句之间的分隔符。然后它说打印行以 c 结尾或开头。

      awk '/BREAK A/;/c$|^c/' file
          BREAK A
          abc
          BREAK A
          cde
          BREAK A
      

      【讨论】:

      • 请在答案中添加一些解释。这将有助于新用户。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 2018-06-30
      • 2013-08-21
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多