对值进行数学计算

时间:2019-04-19 12:09:22

标签: vim

我需要将.json文件中的值乘以常量,然后偶然发现了VIM。我对它的工作方式有一个想法,但我无法正确编写代码。

我在这里找到了一个可以做到这一点的解决方案,但是它对我不起作用。

这是我数据的一部分:

{
      "y":-1.22895,
      "x":238.742,
      "z":11.9502,
      "t":105.089
    },
    {
      "y":-2.97314,
      "x":233.357,
      "z":11.9462,
      "t":105.219
    },
    {
      "y":-4.43459,
      "x":228.235,
      "z":11.9494,
      "t":105.34
    },
    {
      "y":-6.14338,
      "x":221.428,
      "z":11.9735,
      "t":105.497
    },
    {
      "y":-7.74595,
      "x":213.972,
      "z":11.9694,
      "t":105.664
    },
    {
      "y":-8.85145,
      "x":207.862,
      "z":11.9787,
      "t":105.798
    },
    {
      "y":-9.909,
      "x":200.992,
      "z":11.9853,
      "t":105.946
    },
    {
      "y":-10.7051,
      "x":194.46,
      "z":11.9934,
      "t":106.083
    },
    {
      "y":-11.5073,
      "x":186.585,
      "z":11.9994,
      "t":106.246
    },
    {
      "y":-12.2703,
      "x":176.342,
      "z":11.9982,
      "t":106.452
    },
    {
      "y":-13.0953,
      "x":162.276,
      "z":11.9976,
      "t":106.728
    },
    {
      "y":-13.8057,
      "x":146.301,
      "z":11.9982,
      "t":107.031
    },
    {
      "y":-14.2355,
      "x":133.919,
      "z":11.9901,
      "t":107.26
    },
    {
      "y":-14.3586,
      "x":120.712,
      "z":11.9926,
      "t":107.501
    },
    {
      "y":-14.2397,
      "x":107.96,
      "z":11.9912,
      "t":107.73
    },
    {
      "y":-13.7702,
      "x":84.152,
      "z":11.9902,
      "t":108.149
    },
    {
      "y":-13.2214,
      "x":65.2566,
      "z":11.9886,
      "t":108.473
    },
    {
      "y":-12.4048,
      "x":48.9632,
      "z":11.9907,
      "t":108.748
    },
    {
      "y":-10.9569,
      "x":26.4007,
      "z":11.9888,
      "t":109.122
    },
    {
      "y":-9.78734,
      "x":6.85818,
      "z":11.9832,
      "t":109.439
    },
    {
      "y":-9.30135,
      "x":-2.72265,
      "z":11.9493,
      "t":109.594
    },
    {
      "y":-7.90726,
      "x":-33.3971,
      "z":12.012,
      "t":110.14
    },
    {
      "y":-6.8483,
      "x":-56.5212,
      "z":11.916,
      "t":110.611
    },
    {
      "y":-6.12536,
      "x":-71.8311,
      "z":11.5912,
      "t":110.955
    },
    {
      "y":-4.54125,
      "x":-106.279,
      "z":10.9337,
      "t":111.887
    },
    {
      "y":-3.8711,
      "x":-123.009,
      "z":11.3316,
      "t":112.511
    },
    {
      "y":-3.42416,
      "x":-138.673,
      "z":11.8336,
      "t":113.365
    },
    {
      "y":-3.45456,
      "x":-142.097,
      "z":11.9435,
      "t":113.649
    },
    {
      "y":-3.62539,
      "x":-146.275,
      "z":12.0535,
      "t":114.203
    },
    {
      "y":-3.94087,
      "x":-147.712,
      "z":12.0764,
      "t":114.672
    },
    {
      "y":-3.96313,
      "x":-147.874,
      "z":12.1092,
      "t":115.127
    },
    {
      "y":-3.96123,
      "x":-147.874,
      "z":12.096,
      "t":115.737
    },
    {
      "y":-3.96069,
      "x":-147.875,
      "z":12.0966,
      "t":116.192
    },
    {
      "y":-3.96119,
      "x":-147.876,
      "z":12.098,
      "t":116.592
    }

我想替换t值,所以我运行了以下命令:

:%s"t":\(d\+\)@\='"t"'.(submatch(1) *0.9)@g

但是我只是遇到一个错误,说找不到"t":\(d\*\)

1 个答案:

答案 0 :(得分:0)

这应该有效:

%s/\("t":\)\(\d\+\(\.\d\+\)\?\)/\=submatch(1) . string((submatch(2) * 0.9))/g

说明:

一般替换采用以下模式:

:%s/pattern/replace/g

g->表示替换所有匹配项

在表达式替换的情况下,我们以\=开始替换部分。之后的所有内容都会是一个表达式,用于评估要替换的文本。

来自h: sub-expression-replace

The whole matched text can be accessed with "submatch(0)".  The text matched
with the first pair of () with "submatch(1)".  Likewise for further
sub-matches in ().

因此,我们将与pattern匹配的"t":用第一对括号括起来,将数字与第二对()括起来。请注意,括号是辅助的,我们要添加用于使用submatch。之后,我们使用字符串连接来打印预期的输出。