このようなファイルがあります。
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
ここでは\K
、置き換えられないように一致の前の部分を終了します。
ただし、ドットのコンテキストに興味がない場合は、tr
(またはtr///
Perlで)を使用してください。