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