2

我有一个分层列表,像这样

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
...

有什么办法可以做到这一点吗?

编辑:

我应该说所有行都有不同的长度。有的只有一项,有的有八项。

一个文件中也有大约 4,000 个。我还有大约 20 个文件要处理。

4

2 回答 2

3

几天前reddit上有一个类似的问题,sylvain_soliman在那里发布的解决方案似乎也适用于这种情况。我在这里发布它只是为了展示解决问题的不同方法。

:%s/\(^\([^,]*\),.\+\)\@<=,/\r\2,/g

为了使其更具可读性,请使用\v

:%s/\v(^([^,]*),.+)@<=,/\r\2,/g

一点解释:

  • :%s/- 替换缓冲区中的所有行
  • \v- 使用“非常神奇”的正则表达式语法(防止转义诸如括号之类的东西)
  • (^([^,]*),.+)- 匹配行首的字符串,后跟逗号,后跟至少一个字符。这会将字符串从行首放置到匹配组 2 中的逗号。
  • @<=- 告诉 vim 以零宽度匹配前一个组,因此它不会被替换。
  • ,- 匹配下一个逗号。
  • /\r\2,/g- 用换行符和匹配组 2 中的字符串替换上面的逗号。
于 2012-05-01T13:03:27.073 回答
2

我使用宏来做到这一点,也许不优雅,但有效。(<CR>enter关键)

ggqqdw:s/,/\="\r".getreg('"').','/g<CR>jq

现在您可以使用@q重复宏:

4000@q

最后,删除所有临时空行

:g/^$/d
于 2012-05-01T08:32:41.907 回答