2014-05-10 25 views
2

我有這樣的文字:如何爲封裝與括號視覺上選定的文本在vim

1 : { 
    NAME : "Some name", 
    VALUE : "Some text" 
}, 
2 : { 
    NAME : "Some name2", 
    VALUE : "Some text2" 
}, 

NAME_1 : "Some name", 
VALUE_1 : "Some text", 
NAME_2 : "Some name2", 
VALUE_2 : "Some text2", 
.... 

如何使用vim的腳本語言或正則表達式這個文本轉換爲以下結構我正在研究surround.vim插件。它很好地包圍着大括號。 我試圖修改它以減去模式_(\ d +),然後在大括號之前加上這個,但我不熟悉vim腳本,所以我沒有做到這一點。

任何意見將不勝感激。

在此先感謝。

回答

3

您可以只用一個:substitute,使用\(...\)捕獲組並將這些子匹配重新安排在替換部件中。這只是複雜的,因爲有幾個小組可以在周圍玩耍,並且因爲圖案跨越兩條線。

:%s/^\(\w\+\)_\(\d\+\)\(\s*:\s*.*\)\n\(\w\+\)_\2\(\s*:\s*.*\),$/\2 : {\r \1\3\r \4\5\r},/ 

這匹配了後面兩行(注意模式中的\n)。通過使用第二行中的號碼(第二捕獲組),它可以確保獲得NAME_1和相應的VALUE_2

提示:這是更容易建立一個搜索/第一,那麼就重用通過:%s//...

模式在更換,經由\r創建的新行。您可以在:help :substitute的幫助中找到更詳細的說明。

+0

太謝謝你了!現在我明白它是如何工作的:) – Sray

1

你可以做到這兩次換人來解決這個

%s,NAME_\d\+\,: {\r&,g 
%s,VALUE_\d\+,&\r}, 

the "&" matches all things searched 
\r inserts new line