在Vim中搜索并替换带有自增的内容

3

我有一个JSON文件,长这样:

{
        "pk": 1,
        "model": "model.Model",
        "fields": {
         "data1": "example",
         "data2": "example"
      }
    },
   {
        "pk": 1,
        "model": "model.Model",
        "fields": {
         "data1": "example",
         "data2": "example"
      }
    },
   {
        "pk": 1,
        "model": "model.Model",
        "fields": {
         "data1": "example",
         "data2": "example"
      }
    },

我想查找并替换“pk”:1,然后递增该值。因此,我的文件应该如下所示:
{
        "pk": 1,
        "model": "model.Model",
        "fields": {
         "data1": "example",
         "data2": "example"
      }
    },
   {
        "pk": 2,
        "model": "model.Model",
        "fields": {
         "data1": "example",
         "data2": "example"
      }
    },
   {
        "pk": 3,
        "model": "model.Model",
        "fields": {
         "data1": "example",
         "data2": "example"
      }
    },

到目前为止,我尝试过:

:let i=1 | g/"pk": 1/s//="pk": .i./ | let i=i+1

通过使用计数器搜索“pk”: 1模式并替换它,但是我有语法错误,遇到了困难。

非常感谢任何帮助/建议。


这个回答解决了你的问题吗?vim使用let命令进行搜索和替换并增加数字 - phd
https://stackoverflow.com/search?q=%5Bvim%5D+replace+increment - phd
1个回答

4

您可以尝试:

:let i=1 | g/"pk": \zs\d\+/ s//\=i/ | let i+=1

 \zs .............. start pattern

为了解决您的问题,请执行以下操作:
:let i=1 | g/"pk": 1/s//\='"pk": ' .i/ | let i=i+1

你可以看到,第一个错误是在替换部分缺少了反斜杠\=。第二个错误是在末尾使用了第二个连接符.,这会使vim尝试将变量与空值连接起来。第三个错误是忘记将 "pk": 放入'单引号'中,否则你会得到未引用的pk。请记住,在这里我们正在将一个字符串与一个数字连接起来。


这看起来不错,但是在解决方案的替换部分,应该把 ':' 放在双引号外面,对吗? - DC Slagel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接