【发布时间】:2020-03-21 13:06:08
【问题描述】:
我有一个包含以下内容的文件:
set x 0.00456 y 0.05896.
我想将数字乘以一个固定的数量(比如说 1000)。这些数字并不总是存在于同一列中,因此任何带有 awk 的东西都不在图片中。我一直在尝试这个,但不确定我使用子匹配的方式是否正确。
%s/ \d*\.\d*/\=submatch(2)*100
【问题讨论】:
标签: regex awk vim text-processing
我有一个包含以下内容的文件:
set x 0.00456 y 0.05896.
我想将数字乘以一个固定的数量(比如说 1000)。这些数字并不总是存在于同一列中,因此任何带有 awk 的东西都不在图片中。我一直在尝试这个,但不确定我使用子匹配的方式是否正确。
%s/ \d*\.\d*/\=submatch(2)*100
【问题讨论】:
标签: regex awk vim text-processing
您的submatch(2) 用法不正确。您没有任何匹配的组,因此您应该使用submatch(0)。
您的代码中的另一个问题是,您应该先将字符串更改为浮点数,然后进行计算:
%s/\v\d+[.]\d+/\=str2float(submatch(0))*1000/g
数字并不总是存在于同一列中,因此任何与 awk 不在画面中。
这不是真的。您可以检查每一列,如果它与数字格式匹配,则进行数学计算:
awk '{for(i=1;i<=NF;i++)if($i~/[0-9]+[.][0-9]+/)$i*=1000}7' file
你也可以在你的 vim 中调用 awk:
%!awk '{for(i=1;i<=NF;i++)if($i~/[0-9]+[.][0-9]+/)$i*=1000}7'
【讨论】: