如何用特定字符串开头的某些行上的括号替换撇号?

时间:2018-03-08 15:11:34

标签: json vim

很抱歉,如果之前已经回答了这个问题,但我看起来非常努力,找不到足够简单的答案(没有环绕声)。 我想用逗号分隔的列表替换所有“ROUTE:”行后跟一个或多个分隔的数字,并将其更改为括号。

{
  "siteid": 17994,
  "ROUTES": "11 10 59 17 25 18",
  "ROUTEDIRS": "11:NB,10:NBNB,59:NB,17:EB,25:NB,18:NB",
}

到此:

{
 "siteid": 17994,
 "ROUTES": [11, 10, 59, 17, 25, 18],
 "ROUTEDIRS": "11:NB,10:NBNB,59:NB,17:EB,25:NB,18:NB"

}

我已经尝试了各种组合,但是我可以解决的ROUTES选择线(实际上有15种不同的键/值),但是使用括号很难。我最初的方法是在所有ROUTES之后将两条新线分开,但是我仍然遇到了支架问题。所有其他问题都提示插件。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

完全按照您的建议行事:

:g/ROUTES/s/:\s*\zs/\r/|s/"/[/|s/"/]/|s/\s\+/, /|-j

步骤:

  • 仅在" ROUTES"上执行通过:g/ROUTES/{cmd}
  • 排成一行
  • 通过s/:\s*/\r/
  • 分隔关键字和值
  • 用括号替换引号,s/"/[/| s /" /] /`
  • 用逗号替换空格s/\s\+/, /
  • 通过-join
  • 加入新的价值线

或者,您可以使用sub-replace-expression:

:g/ROUTES/s/:\s\zs"\(.*\)"/\='['.join(split(submatch(1), '\s\+'), ', ').']'

如需更多帮助,请参阅:

:h :g
:h :s
:h /\zs
:h :j
:h :range
:h sub-replace-expression
:h split()
:h join()
:h submatch()