Делать математику на значении - PullRequest
0 голосов
/ 19 апреля 2019

Мне нужно умножить значения в файле .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 голосов
/ 19 апреля 2019

Это должно работать:

%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. После этого мы используем конкатенацию строк для вывода ожидаемого результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...