我有一个以空格分隔的数字 .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 位数字之外的所有数字。\zs
isvim
相当于重置匹配部分的开头perl
。\K
您还可以执行以下操作:
:%s/\d\+\.\d\+/\=printf("%.6f", str2float(submatch(0)))/g