我有这样的文字:
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脚本并不熟悉,所以我没有这样做。
任何建议都将受到重视。
提前致谢。
答案 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