我有这样的文字:
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 脚本,所以我没能做到这一点。
任何建议将不胜感激。
提前致谢。
最佳答案
您只需一个 :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
下的帮助中找到更详细的说明。
关于regex - 如何在vim中用大括号括住视觉上选择的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23578692/