Perl:查找具有匹配字符串(str1)的行,并且仅在那些匹配的行中,用特定字符串(str3)替换一个字符串(str2)

时间:2017-03-28 14:06:11

标签: regex perl

我有一个文件a.txt,内容如下:

a aa aaa
b bb value = 11 xyz
c cc ccc
b bb value = 222 abc
d dd ddd

我必须找到字符串“bb”。一旦找到匹配的行,我必须将“value = xxx”替换为“value = 77” 这里,xxx是任意数字的整数(在上述情况下为11,222)。

我试过下面的perl命令:

perl -n -e 'print; if (m/\bbb\b/) { s/value = (\d+)/value = 77/g; print; }' < a.txt

它输出为:

a aa aaa
b bb value = 11 xyz
b bb value = 77 xyz
c cc ccc
b bb value = 22 abc
b bb value = 77 abc
d dd ddd

我在这里寻找就地更换,而不是需要更改的新行。 基本上我期待输出如下:

a aa aaa
b bb value = 77 xyz
c cc ccc
b bb value = 77 abc
d dd ddd

任何人都可以帮助我更新我的命令吗?

还有一个更快的问题,我可以更新上面的命令,以便它可以搜索字符串“bb”,只有匹配的行将从此匹配行中完全删除字符串“value = xxx”。 其中xxx是任意数字的整数。

2 个答案:

答案 0 :(得分:3)

匹配时打印两次。如果您不想这样做,请不要这样做:)

perl -n -e 'if (m/\bbb\b/) { s/value = (\d+)/value = 77/g; } print' < a.txt

清理:

perl -pe's/value = \K\d+/77/g if /\bbb\b/' a.txt

根据示例数据,您甚至可以使用

perl -pe's/\bbb\b.*value = \K\d+/77/' a.txt

答案 1 :(得分:1)

这有效:

perl -n -e 'if (m/\bbb\b/) { s/value = (\d+)/value = 77/g; print; } else {print}' < a.txt

if中放置一个打印件,在else

中放置一个打印件

输出:

$ perl -n -e 'if (m/\bbb\b/) { s/value = (\d+)/value = 77/g; print; } else {print}' < a.txt
a aa aaa
b bb value = 77 xyz
c cc ccc
b bb value = 77 abc
d dd ddd