
このようなファイルがあります
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 の場合) を使用します。