【问题标题】:Conditionally remove lines between two patterns in a file [closed]有条件地删除文件中两个模式之间的行[关闭]
【发布时间】:2016-05-05 15:35:49
【问题描述】:

输入文件:

<Chunk of text>
PATTERN1
ABC
EFG
HIJ
PATTERN2
KLM
NOP
PATTERN3
<Chunk of text>

输出文件:

<Chunk of text> 
<Chunk of text>

仅当文件(包括)PATTERN 1 和 PATTERN 3 之间存在 PATTERN2 时,如何删除它们之间的行

【问题讨论】:

  • 问题定义清楚就容易了。 PATTERN1 ... PATTERN1 ... PATTERN2 ... PATTERN1 ... PATTERN3 ... PATTERN2 ... PATTERN3 怎么样 - 那么应该删除什么?请展示您到目前为止编写的代码/正则表达式,并说明它如何无法按预期工作。

标签: python perl vim awk sed


【解决方案1】:
import sys,re
flaG,deletE,storE = False,False,""
for linE in open(sys.argv[1]):
    if re.search('pattern1',linE): 
        flaG = True
        print storE
        storE = linE
        continue
    if flaG :
        storE += linE
        if re.search('pattern2',linE): deletE = True
        if re.search('pattern3',linE) :
            if not deletE : print storE
            storE = ''
            flaG = False
            deletE = False
    else : print linE,
print storE

【讨论】:

    【解决方案2】:

    这里的工作工具可能是范围运算符 - 测试您当前是否在两个模式(或行号)之间。

    • 测试您是否介于 PATTERN1 和 PATTERN3 之间。
    • 存储在缓冲区中
    • 当您点击“PATTERN3”时,检查您是否看到了 PATTERN2,然后打印或丢弃您的缓冲区。

    例如:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    
    
    my @buffer; 
    my $found = 0; 
    while ( <DATA>) {
       #check we are between patterns
       if ( m/PATTERN1/ .. m/PATTERN3/ ) {
          #test if pattern 2 is in this chunk. 
          if ( m/PATTERN2/ ) { $found++; }
          #stash this line
          push @buffer, $_; 
       }
       else {
           #outside pattern1..pattern3
           #do we have a pending buffer? (e.g. just finished)
           if ( @buffer ) { 
              #print if we didn't see a pattern 2
              if ( not $found ) { print @buffer }
              #reset buffer and count of pattern 2. 
              $found = 0;
              @buffer = ();
           }
           #print current line. 
           print; 
       }
    }
    
    __DATA__
    <Chunk of text>
    PATTERN1
    ABC
    EFG
    HIJ
    PATTERN2
    KLM
    NOP
    PATTERN3
    <Chunk of text>
    

    【讨论】:

      猜你喜欢
      • 2013-10-29
      • 1970-01-01
      • 2018-02-13
      • 2016-03-22
      • 2020-09-05
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多