如何在vim中用括号括起视觉选择的文本

时间:2014-05-10 08:11:31

标签: regex vim vim-plugin

我有这样的文字:

NAME_1  : "Some name",
VALUE_1 : "Some text",
NAME_2  : "Some name2",
VALUE_2 : "Some text2",
....

如何使用vim脚本语言或正则表达式将此文本转换为以下结构:

1 : {
    NAME  : "Some name",
    VALUE : "Some text"
},
2 : {
    NAME  : "Some name2",
    VALUE : "Some text2"
},

我正在研究surround.vim插件。它很好地围绕着牙箍。 我尝试修改它以通过模式_(\ d +)进行减法,然后在大括号之前添加它,但我对vim脚本并不熟悉,所以我没有这样做。

任何建议都将受到重视。

提前致谢。

2 个答案:

答案 0 :(得分:3)

您可以只使用一个:substitute,使用\(...\)捕获组,并在替换部分中重新排列这些子匹配。它只是复杂的,因为有几个小组可以兼顾,因为这个模式跨越了两行。

:%s/^\(\w\+\)_\(\d\+\)\(\s*:\s*.*\)\n\(\w\+\)_\2\(\s*:\s*.*\),$/\2 : {\r    \1\3\r    \4\5\r},/

这匹配两个后续行(注意模式中的\n)。通过使用第二行中的数字(第二个捕获组),它可以确保获得NAME_1和相应的VALUE_2

提示:首先更容易构建为搜索/,然后只需通过:%s//...

重复使用该模式

在替换中,换行符是通过\r创建的。您可以在:help :substitute下的帮助中找到更详细的说明。

答案 1 :(得分:1)

你可以做两次替换来解决这个问题

%s,NAME_\d\+\,: {\r&,g
%s,VALUE_\d\+,&\r},

the "&" matches all things searched
\r inserts new line
相关问题