Vim正则表达式每隔几行添加花括号

时间:2016-08-19 16:55:13

标签: json regex vim

我正在创建一个json文件,并且已经研究了如何将双引号等附加到适当的行,但我需要知道如何用花括号包裹每2行。

例如:

"value": "Bahraini Foreign Ministry"
"tag": "project:bahrain;id:2201",
"value": "Bahraini Foreign Minister"
"tag": "project:bahrain;id:2202",

需要:

{
"value": "Bahraini Foreign Ministry"
"tag": "project:bahrain;id:2201",
},
{
"value": "Bahraini Foreign Minister"
"tag": "project:bahrain;id:2202",
},

我尝试了:%norm:%s,并在这里绕圈子。任何想法都表示赞赏!

1 个答案:

答案 0 :(得分:2)

dNitro's solution是一种方法。这是另一种方式:

qqqqqqO{<esc>jjo},<esc>j@qq@q

这会创建一个递归宏,例如一个自称的宏。由于递归宏一直运行直到它们遇到错误,并且在最后一行调用j会引发错误,这将适用于任何数据大小。说明:

qqq清除注册表&#39; q&#39;。 qq开始在注册表中记录&#39; q&#39;。 O{<esc>在当前行上方的行上插入一个括号。 jj向下移动(使用&#34;标记&#34;在其上)。 o},<esc>在当前行之后的下一行放置一个括号。 j@q使用&#34;值&#34;,然后@q调用&#39; q&#39;宏。因为你录制时它是空的,所以它实际上什么也做不了。但是,一旦你点击q@q,这将停止录制,然后调用此递归宏。

另一种选择是使用:global命令,例如

:g/value/normal O{^[jjo},

请注意,^[是一个文字转义字符,您必须按&#34; ctrl-v,ctrl-esc&#34;

输入

这基本上是相同的,除了使用宏之外,它会在&#34; normal&#34;之后自动应用一组击键。到包含文本&#34;值&#34;的每一行。

只是为了好玩,这是最后一个选择,一个替代命令:

:%s/.*"value".*\n.*,/{\r&\r},,

这将替换第一行包含文本"value"的两行,并在括号中包含相同的文本。