perl中的多行搜索和替换

时间:2014-12-22 10:18:32

标签: regex perl

我需要一些使用perl命令替换特定字符串的帮助,但问题是我需要仅从相关标记替换此字符串并将其保留在所有其他标记中

我的文本文件如下所示

[myTag]
some values 
and more values
my_string_To_Replace
some more values

[anotherTag]
more values
my_string_To_Replace

I did try below but this command replaces last occurrence only

Thanks
perl -p -i'.backup' -e 'BEGIN{undef $/;} s/(\[myTag\].*)(my_string_To_Replace)(.*)/$1NewString$3/smg' myText.file
      I'm expecting below results
[myTag]
some values 
and more values
NewString
some more values

[anotherTag]
more values
my_string_To_Replace

3 个答案:

答案 0 :(得分:1)

我会这样做,

$ perl -00pe 's/\[myTag\].*?\Kmy_string_To_Replace/NewString/gs' file
[myTag]
some values 
and more values
NewString
some more values

[anotherTag]
more values
my_string_To_Replace

\K会丢弃先前匹配的字符,-00会启用段落污点模式。

答案 1 :(得分:0)

如果你没有一个班轮就可以了,这应该可以解决问题。使用记录分隔符来检测您是否在[myTag]^$之间,例如一个空白行。

use strict;
use warnings;

while ( <DATA> ) {
     if ( m/\[myTag\]/ .. /^$/ ) {
          s/my_string_To_Replace/some_other_text/;
     }
     print;        
}


__DATA__
[myTag]
some values 
and more values
my_string_To_Replace
some more values

[anotherTag]
more values
my_string_To_Replace

如果你真的想要一个&#39;

;

perl -p -i.bak -ne " if ( m/\[myTag\]/ .. /^$/ ) { s/my_string_To_Replace/some_other_text/; } " file.txt

答案 2 :(得分:0)

我刚刚与Avinish Raj建议的差异很小

perl -p -i'.backup' -e 'BEGIN{undef $/;} s/\[myTag\].*?\Kmy_string_To_Replace/NewString/gs' myFile