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 の場合) を使用します。

関連情報