小数点以下5桁をすべて探して一桁ずつ追加

小数点以下5桁をすべて探して一桁ずつ追加

スペースで区切られた数字を含む.txtファイルがあります。

40.766375 -84.267443
40.766355 -84.267463
40.766325 -84.263443
...

場合によっては、最初の列に小数点以下6桁の数字がない場合があります。

40.76632 -84.263443

この問題が発生するたびに、最後にゼロを挿入して次のような結果を得たいと思います。

40.766320 -84.263443

行が多すぎて(36000以上)正規表現を使用してこれを実行したいと思います。どんなアイデアがありますか?

編集:似たようなものが必要なようですが、 :%s/\.d{5}/\.d{5}0 そこに行くことはできません。

答え1

:%s/\(\.\d\{5\}\) /\10 /

これはあなたが望むことをすることができます。

説明する

\(\.\d{5\}\)最初に表示される点(\.)と5つの数字()をキャプチャします\d\{5\}。また、キャプチャグループの後にスペースを残して、正確に5つのキャプチャグループがあることを確認します。

置換の2番目の部分は、\1最初(そして1回)のキャプチャグループにアクセスするために使用され、0その後にスペースを入れ、スペースが正規表現と一致しますが、2番目の部分には送信されないため、スペースを入れます。

グループキャプチャに関するいくつかの情報:\10まさに「グループ番号1キャプチャ、その後に0が続く」。したがって、8つのグループにのみアクセスできます。

答え2

すべての数字にピリオドの後に 6 桁の数字があるようにする、より一般的な方法で次のことができます。

:%s/\.\d\+/&00000/g
:%s/\.\d\{6}\zs\d*//g

最初は5つのゼロを追加し、2番目はピリオドの後の最初の6桁を除くすべての数字を削除します。\zsこれはvim、一致する部分の先頭をリセットするのと同じですperl\K

次のこともできます。

 :%s/\d\+\.\d\+/\=printf("%.6f", str2float(submatch(0)))/g

関連情報