我有一个这样的文件
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 中)。