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

これを行う方法はありますか?

編集:

すべての行の長さが異なると言わざるを得ません。項目が 1 つしかない人もいれば、8 つある人もいます。

また、1 つのファイルに約 4,000 個あります。あと 20 個ほどのファイルがあります。

4

2 に答える 2

3

数日前に reddit で同様の質問がありました。sylvain_soliman によって投稿された解決策は、この場合にも機能するようです。問題への別のアプローチを示すためだけに、ここに投稿しています。

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

これをもう少し読みやすくするには、次を使用します\v

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

少し説明:

  • :%s/- バッファ内のすべての行を置き換えます
  • \v- 「非常に魔法の」正規表現構文を使用します (括弧などのエスケープを防ぎます)
  • (^([^,]*),.+)- 行頭の文字列に一致し、その後にカンマが続き、その後に少なくとも 1 文字が続きます。これにより、行の先頭からコンマまでの文字列が一致グループ 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 に答える