2012-05-01 97 views
2

我有一個分層列表,這樣重新排序數據

Menu1,SubMen1.1,SubMen1.2,SubMen1.3 
Menu2,SubMen2.1,SubMen2.2,SubMen2.3 
Menu3,SubMen3.1,SubMen3.2,SubMen3.3 

,我想運行一個腳本或rearanges的信息,以這種

Menu1,SubMen1.1 
Menu1,SubMen1.2 
Menu1,SubMen1.3 
Menu2,SubMen2.1 
Menu2,SubMen2.2 
Menu2,SubMen2.3 
... 

一個宏有什麼辦法我可以做到這一點?

編輯:

我應該說,所有的行有不同的長度。有些只有一個項目,其他有八個。

在一個文件中也有大約4,000個。我還有大約20個文件要去。

回答

3

有一個similar question on reddit几几天前,the solution posted there by sylvain_soliman似乎也適用於這種情況。我在這裏發佈它僅僅是爲了展示解決問題的不同方法。

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

爲了使這一點更具可讀性,使用\v

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

一點的解釋:

  • :%s/ - 替換在所有線路中的緩衝
  • \v - 使用「非常神奇」的正則表達式語法(防止像parens這樣的東西逃跑)
  • (^([^,]*),.+) - 匹配行首的字符串,後跟逗號,後跟至少一個字符。這將字符串從行首開始,直到匹配組2中的逗號。
  • @<= - 告訴vim與零寬度匹配前一組,因此它不會被替換。
  • , - 匹配下一個逗號。
  • /\r\2,/g - 從上面有一個換行符和字符串從matchgroup的2
+0

美麗!我試圖找到這個問題的單行正則表達式,但我無法讓嵌套的匹配組工作。這是一個非常有益的答案。 –

2

我使用宏來做到這一點,也許不是優雅,但工程。 (<CR>enter鍵)

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

現在你可以使用@q重複宏:最後

[email protected] 

,刪除所有臨時空行

:g/^$/d 
+2

我認爲這將是解釋這個有用的替代逗號! –

+0

我得到了大部分,但我有的問題是,一些長度是不同的。像一些菜單隻有兩個項目,而其他有8個。 – vonHippie

+0

@vonHippie我更新了我的答案,您的需要 –