Python 有条件地删除文件中两个模式之间的行

Python 有条件地删除文件中两个模式之间的行,python,perl,vim,awk,sed,Python,Perl,Vim,Awk,Sed,输入文件: <Chunk of text> PATTERN1 ABC EFG HIJ PATTERN2 KLM NOP PATTERN3 <Chunk of text> 模式1 基础知识 EFG 你好 模式2 荷航 不 模式3 输出文件: <Chunk of text> <Chunk of text> 如何仅当文件的模式1和模式3(包括模式1和模式3)之间存在模式2时删除它们之间的行此处的作业工具可能是范围运算符-测试您当前是否处于两

输入文件:

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

模式1
基础知识
EFG
你好
模式2
荷航
不
模式3
输出文件:

<Chunk of text> 
<Chunk of text>


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

此处的作业工具可能是范围运算符-测试您当前是否处于两个模式(或行号)之间

  • 测试您是否处于模式1和模式3之间
  • 存储在缓冲区中
  • 当你点击“PATTERN3”时,检查你是否看到了PATTERN2,然后打印或丢弃你的缓冲区
例如:

#/usr/bin/env perl
严格使用;
使用警告;
我的@buffer;
我的$found=0;
而(){
#检查我们是否处于模式之间
if(m/PATTERN1/.m/PATTERN3/){
#测试模式2是否在此块中。
if(m/PATTERN2/){$found++;}
#把这条线藏起来
推送@缓冲区,$\;
}
否则{
#外部模式1..3
#我们是否有挂起的缓冲区?(例如,刚刚完成)
如果(@buffer){
#如果没有看到图案2,请打印
如果(未找到$){print@buffer}
#重置模式2的缓冲区和计数。
$found=0;
@缓冲区=();
}
#打印当前行。
印刷品;
}
}
__资料__
模式1
基础知识
EFG
你好
模式2
荷航
不
模式3

如果问题定义清楚,就很容易解决。那么
PATTERN1。。。模式1。。。模式2。。。模式1。。。模式3。。。模式2。。。模式3
-那么应该删除什么?请展示您迄今为止编写的代码/正则表达式,并解释它是如何不按预期工作的。
#!/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>
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