在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/
    -替换缓冲区中的所有行
  • \v
    -使用“非常神奇”的正则表达式语法(防止像paren这样的转义)
  • (^([^,]*),.+)
    -匹配行首的字符串,后跟逗号,后跟至少一个字符。这会将字符串从行首放置到匹配组2中的逗号

  • @我想解释一下这一点会很有用!我得到了大部分,但问题是有些长度是不同的。就像有些菜单只有两项一样,而有些菜单只有8项。@Ethan。谢谢当我为每一行手动操作时,它就工作了。但当我这么做的时候400@q它告诉我这不是命令。嗯。。。你真的按了[code>enter
    键而不是在vim命令行中键入“”?真漂亮!我试图为这个问题找到一个单行正则表达式,但是我无法让嵌套的匹配组工作。这是一个很有启发性的回答。
    :g/^$/d
    
    :%s/\(^\([^,]*\),.\+\)\@<=,/\r\2,/g
    
    :%s/\v(^([^,]*),.+)@<=,/\r\2,/g