【问题标题】:Extract lines between A and (B or C), containing D提取 A 和(B 或 C)之间的线,包含 D
【发布时间】:2015-08-05 13:48:09
【问题描述】:

我需要提取 A 和(B 或 C)模式之间的文本,其中包含 D 模式。

例如我有一个文件,需要提取“proc sql”和(“quit”或“run”)之间的所有内容,其中包含“index”。

proc sql bla-bla-bla 指数=10; 放弃 proc sql bla-bla-bla 放弃; proc sql 指数=10; 跑步

需要的输出:

proc sql bla-bla-bla 指数=10; 放弃 proc sql 指数=10; 跑步

现在我有这样的解决方案:

perl -0777 -lne 'print for grep /\bindex\b/i, /^proc sql.*?quit.*?\n/mgs' file

但它只在“proc sql”和“quit”(不是“quit”或“run”)之间提取,包含“index”。不知道怎么加OR运算。

如果您能提出替代的 awk/sed/grep 解决方案 - 那就太好了。

【问题讨论】:

    标签: bash perl awk sed grep


    【解决方案1】:

    这将按照您的要求进行。它累积到$block 开始和结束模式之间的所有行。当到达结束模式时,如果它包含index

    ,它会打印块
    use strict;
    use warnings;
    
    my $block;
    
    while ( <DATA> ) {
      my $state = /^proc sql\b/ .. /^(?:quit|run)\b/;
      $block .= $_ if $state;
      if ( $state =~ /E/ ) {
        print $block, "\n" if $block =~ /^index=/m;
        $block = '';
      }
    }
    
    __DATA__
    proc sql
    bla-bla-bla
    index=10;
    quit
    
    proc sql
    bla-bla-bla
    quit;
    
    proc sql
    index=10;
    run
    

    输出

    proc sql
    bla-bla-bla
    index=10;
    quit
    
    proc sql
    index=10;
    run
    

    【讨论】:

      【解决方案2】:

      鉴于您的输入文件名为 input.txt,这将在 awk 中解决:

      awk 'BEGIN {
          procDetected = 0;
          indexDetected = 0;
      }
      
      /proc/ {
          buffer = "";
          indexDetected = 0;
          procDetected = 1;
      }
      
      /index/ {
          indexDetected = 1;
      }
      
      {
          if (procDetected) {
              # Add the line to the buffer.
              buffer = buffer $0 "\n";
          }
      }
      
      /run/ || /quit/ {
          if (procDetected && indexDetected) {
              print buffer;
          }
          procDetected = 0;
          indexDetected = 0;
      }' input.txt
      

      【讨论】:

        猜你喜欢
        • 2012-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多