我需要一些使用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
答案 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