[英]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.