在Vim中重新排序数据
我有一个分层列表,如下所示在Vim中重新排序数据,vim,macros,rows,Vim,Macros,Rows,我有一个分层列表,如下所示 Menu1,SubMen1.1,SubMen1.2,SubMen1.3 Menu2,SubMen2.1,SubMen2.2,SubMen2.3 Menu3,SubMen3.1,SubMen3.2,SubMen3.3 我想运行一个脚本或宏,将信息重新设置为 Menu1,SubMen1.1 Menu1,SubMen1.2 Menu1,SubMen1.3 Menu2,SubMen2.1 Menu2,SubMen2.2 Menu2,SubMen2.3 ... 我有什么办法
Menu1,SubMen1.1,SubMen1.2,SubMen1.3
Menu2,SubMen2.1,SubMen2.2,SubMen2.3
Menu3,SubMen3.1,SubMen3.2,SubMen3.3
我想运行一个脚本或宏,将信息重新设置为
Menu1,SubMen1.1
Menu1,SubMen1.2
Menu1,SubMen1.3
Menu2,SubMen2.1
Menu2,SubMen2.2
Menu2,SubMen2.3
...
我有什么办法可以做到这一点吗
编辑:
我应该说所有的行都有不同的长度。有的只有一件,有的有八件
一个文件中也有大约4000个。我还有大约20个文件要处理。我使用宏来完成这项工作,可能并不优雅,但很有效。(
是输入
键)
最后,删除所有临时空行
:g/^$/d
前几天有一个,似乎也适用于这个案子。我把它贴在这里仅仅是为了展示一种不同的方法来解决这个问题
:%s/\(^\([^,]*\),.\+\)\@<=,/\r\2,/g
一点解释:
-替换缓冲区中的所有行:%s/
-使用“非常神奇”的正则表达式语法(防止像paren这样的转义)\v
-匹配行首的字符串,后跟逗号,后跟至少一个字符。这会将字符串从行首放置到匹配组2中的逗号(^([^,]*),.+)
键而不是在vim命令行中键入“”?真漂亮!我试图为这个问题找到一个单行正则表达式,但是我无法让嵌套的匹配组工作。这是一个很有启发性的回答。@我想解释一下这一点会很有用!我得到了大部分,但问题是有些长度是不同的。就像有些菜单只有两项一样,而有些菜单只有8项。@Ethan。谢谢当我为每一行手动操作时,它就工作了。但当我这么做的时候400@q它告诉我这不是命令。嗯。。。你真的按了[code>enter
:g/^$/d
:%s/\(^\([^,]*\),.\+\)\@<=,/\r\2,/g
:%s/\v(^([^,]*),.+)@<=,/\r\2,/g