使用 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 中)。

相關內容