2014-06-19 3 views
0

perl에서 두 개의 tage 사이에 줄 바꾸기에 도움이 필요합니다.perl의 두 태그 사이의 줄을 수정하십시오.

some lines 

some lines 

tag1 

ABC somelines 

NOP 

NOP 

ABC somelines 

NOP 

NOP 

ABC somelines 

tag2 

당신이 볼 수 있듯이, 나는 두 개의 태그 tag1로하고이 tag2이 기본적으로, 나는이 tag1 사이 NOP와 ABC의 모든 인스턴스를 대체 할 : 나는 두 태그 사이에 줄을 수정하고자하는 파일을 및 tag2. 다음은 코드의 관련 부분이지만 대체하지는 않습니다. 누구든지 도와주세요 ..? 범위 연산자 파일을 편집하는 다른 방법에 대한 ..

use strict; 
use warnings; 

local $^I = '.bak'; 
local @ARGV = $cur_file; 
while (<>) { 
    if (/^tag1/ .. /^tag2/) { 
     s/ABC/NOP/; 
    } 
    print; 
} 
unlink "$cur_file$^I"; #delete backup; 

와 함께

 my $fh; 
     my $cur_file = "file_name"; 
     my @lines =(); 
     open($fh, '<', "$cur_file") or die "Can't open the file for reading $!"; 
     print "Before while\n"; 
     while(<$fh>) 
     { 
      print "inside while\n"; 
      my $line = $_; 
      if($line =~ /^tag1/) 
      { 
       print "inside range check\n"; 
       $line = s/ABC/NOP/; 
       push(@lines, $line); 
      } 
      else 
      { 
       push(@lines, $line); 
      } 

     } 
     close($fh); 

     open ($fh, '>', "$cur_file") or die "Can't open file for wrinting\n"; 
     print $fh @lines; 
     close($fh); 

답변

2

Flip-Flop 연산자를 사용하여 한 줄을 고려하십시오. $line = s/ABC/NOP/;가 잘못된 말한다

perl -i -pe 's/ABC/NOP/ if /^tag1/ .. /^tag2/' file 
0

귀하의 라인은 당신이 거기 =~이 필요합니다.

#!/usr/bin/perl 
use strict; 
use warnings; 
my $tag1 = 0; 
my $tag2 = 0; 
while(my $line = <DATA>){ 
    if ($line =~ /^tag1/){ 
     $tag1 = 1; #Set the flag for tag1 
    } 
    if ($line =~ /^tag2/){ 
     $tag2 = 1; #Set the flag for tag2 
    } 
    if($tag1 == 1 && $tag2 == 0){ 
     $line =~ s/ABC/NOP/;  
    } 
    print $line; 
} 

Demo

관련 문제