2013-06-27 143 views
6

我想用vim的搜索和替換替換所有的「with」,反之亦然。有沒有辦法一步到位呢?我在想這樣的事情:vim中的條件替換

:s/\("\|'\)/\1=="?':"/ 

其中當然\1=="?':" -part是什麼,在vim工程提前

感謝

回答

14

這是一個案例:help sub-replace-special

:s/["']/\=submatch(0) == '"' ? "'" : '"'/g 

這個匹配的兩個引號(以更簡單的方式與[...]),然後使用三元運算符把每個引號走向反面。 (對於更復雜的情況,可以使用字典查找。)

+0

不錯的一個!非常感謝你! – Vince

+0

在替換表達式中是否可以使用匹配的模式'\ 1','\ 2',...?我嘗試過,但反斜槓是從字面上插入的。 –

+1

@EnricoMariaDeAngelis:是的,通過'submatch(1)'等;文字'1'在這裏不起作用。 –

0

也許最懶/最簡單的方法:!

:%s/'/__/g | %s/"/'/g | %s/__/"/g 

三個基本步驟合併成一條線:

  1. 轉換'__(或東西隨機)
  2. 轉換"'
  3. 轉換__"

然後將它們有機結合起來|符號。

我確定一些vim嚮導會有更好的解決方案,但是這對我有用。

+0

我想到這一點,我肯定可以做到這一點,但是VIM是威武之師,我只是好奇,如果有一個一步到位的解決方案對於這個問題;-) – Vince

+0

Vim是強大的。我相信人們會更容易。 – jahroy

3

另一種方法(更適合於腳本)是使用內置的tr()函數。要應用它的緩衝區,getline()/setline()用於:

:call setline('.', tr(getline('.'), "'\"", "\"'")) 
2

你可以這樣做很容易地通過使用abolish.vim插件。

Abolish.vim有一個:Subvert命令,它爲您提供了一種在自己的小DSL中搜索和替換的不同方法。

:%S/{\",'}/{',\"}/g 

這個插件已經接收到具有在Vimcasts.org 三部分截屏專門給它的特殊榮譽:onetwothree

+0

什麼是'\「'的轉義;這非常不直觀?!(當我刪除它時,我得到一個'E64'。 –

3

功率的Unix工具;)

:%!tr "'\"" "\"'"