2012-10-03 74 views

回答

2

做一次更換正則表達式,交換周圍的逗號兩組:

:%s/flux(\([^,]*\),\([^)]*\))/flux(\2,\1)/ 

拆毀了

:%s/  #global replace 
flux(  #find 'flux(' 
\([^,]*\), #match everything until a comma into group 1 
\([^)]*\)) #match everything until a ')' into group 2 
/  #replace with: 
flux(  #text 'flux(' 
\2,\1  #group 2, followed by group 1 
)/   #close parenthesis and end match 

如果一條線上有多個流量調用,最後加上g

+0

哇!它像寶石一樣工作。我從來不知道VI是如此強大的 – arunmoezhi

+0

如果我有一個4D數組並想切換第一個和最後一個維度,那麼我應該將它們分成4組,然後將它們排序爲'\ 4,\ 2,\ 3,\ 1' ? – arunmoezhi

+0

@arunmoezhi - 應該工作。您也可以將2和3放入一個組中,因爲您沒有將它們分開。然後你只有3個組,你只需交換1和3. – Tim

1

你可以使用一個替代:

:%s/\([0-9]\),i/i,\1/g 

這將打開<數字的每一次亮相>,我到我,<位數> 。

+0

這幾乎奏效。但我也有這種情況: '通量(m,i + 1)'到'通量(i + 1,m)' – arunmoezhi

+0

蒂姆的答案基於同樣的想法,具有更強大的替代。 – Joni

1

是的,這是可能的。這裏有一種方法爲您給定的輸入,首先將光標定位到第一架F:

f1<c-q>4jxlphh<c-q>4jxp

1

從命令模式:

:%! m4 -Dflux='`flux($2,$1)'"'" 

這將運行當前緩衝區通過m4做替代。請注意, 這將正確地替換跨越換行符或包含嵌套括號或遞歸的輸入。例如,

flux(text that contains parens 
    and (spans) a newline,flux(q, r)) 

將與

flux(flux(r ,q) ,text that contains parens 
    and (spans) a newline) 

被替換如果嵌套的括號不匹配,你會得到一個錯誤。此外,任何變量參數的前導空格都將被丟棄,但這是一個更強大的解決方案,您可以嘗試使用正則表達式匹配。

+0

我可以問這是什麼嗎?我試着在我的vim中運行它,並且它說「Shell返回了1,5行過濾器」,並用'Unmatched(backtick)替換了我文檔中的所有文本。「# – Tim

+0

您應該儘可能使用內置的VI命令。 – Bernhard

+0

這將通過'm4'運行緩衝區的內容,並用輸出替換緩衝區的內容。 '不匹配(反向)'是來自你的shell的錯誤信息。也許你在反引用前沒有包含反斜槓。嘗試使用不同的引用樣式:':$!m4 -DFlux =''flux($ 2,$ 1)'''「'('flux'前的單引號應該是反引號,但我不知道如何在SO評論中逃脫。) –

相關問題