使用 sed 或 perl 将点替换为字符

使用 sed 或 perl 将点替换为字符

我有一个这样的文件

KN1234.1
KN2345.1
KN1233.1

我想更换 .与 v 以便我可以得到输出

KN1234v1
KN2345v1
KN1233v1

之后 。它总是 1,但在 KN 之后我也可以有最多 5 位数字。像这样的事情也是可能的KN14345.1,它的输出应该是KN14345v1

我尝试过 sed 命令

sed 's/KN\d+.1/KN\d+v1/g' file.txt

但什么也没发生。我怎样才能解决这个问题?

Perl 解决方案也将受到赞赏。

谢谢

答案1

这:

sed 's/KN\d+.1/KN\d+v1/g' file.txt

不执行任何操作,因为您的 sed 不太可能支持\d(我认为它来自 Perl),因此模式不匹配任何内容。你可能想参考这个:为什么我的正则表达式在 X 中有效但在 Y 中无效?

无论如何,它都不会按您想要的方式工作,因为它只是在替换部分中\d转义,并且并不特殊,因此您的数字会被替换。d+

在 Perl 中,你可能想要这样的东西:

perl -pe 's/(KN\d+)\.1/$1v1/'  file.txt 

其中$1扩展到括号​​中的第一组,并且点被转义,因为它是正则表达式任何字符。或者

perl -pe 's/KN\d+\K\.1/v1/'  file.txt 

where\K杀死匹配的前面部分,以便它不会被替换。

不过,如果您不关心点的上下文,请使用tr. (或tr///在 Perl 中)。

相关内容