查找所有出现的小数点后 5 位数字,添加一位数字

查找所有出现的小数点后 5 位数字,添加一位数字

我有一个以空格分隔的数字 .txt 文件:

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

偶尔,第一列中有一个数字小数点后没有6位:

40.76632 -84.263443

我想在每次出现此类情况的末尾插入一个 0,这样我最终会得到:

40.766320 -84.263443

有很多行(超过 36000 行),所以我想使用正则表达式来完成此操作。有任何想法吗?

编辑:我想我需要类似的东西 :%s/\.d{5}/\.d{5}0 ,但我无法完全到达那里。

答案1

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

这可以做你想做的事。

解释

我们\(\.\d{5\}\)捕获第一次出现的点 ( \.) 和五个数字 ( \d\{5\})。另外,我们通过在捕获组后留出空格来检查它们是否正好有五个。

在替换的第二部分中,我们用于\1访问第一个(也是一次)捕获组,放在0它后面并在末尾放置一个空格,因为该空格由正则表达式匹配,但没有转移到第二个部分。

关于捕获组的一些信息:\10正是“捕获组编号为 1,其后为 0”。因此,您只能访问八个组。

答案2

作为强制所有数字在句点后具有 6 位数字的更通用方法,您可以执行以下操作:

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

第一个添加 5 个零,第二个删除句点后除前 6 位数字之外的所有数字。\zsisvim相当于重置匹配部分的开头perl\K

您还可以执行以下操作:

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

相关内容