繁体   English   中英

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

[英]Perl: Find line with matching string(str1) and only in those matched lines, replace one string(str2) with specific string(str3)

我有一个文件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是具有任意数字位数的整数。

当您有比赛时,您将打印两次。 如果您不想这样做,请不要这样做:)

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

这有效:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM