2010-01-20 136 views
23

我有類似於<Foobar Name='Hello There'/>的東西,需要將單引號更改爲雙引號。我試過:s/\'.*\'/\"\0\",但最終產生了<Foobar Name="'Hello There'"/>。替換\0\1只在雙引號內產生一個空字符串 - 是否有一些特殊的語法,我錯過了,我只需要使引號內的找到的字符串(「你好有」)分配給\1替換Vim中字符串的引號?

回答

20

你需要用分組:

:s/\'\(.*\)\'/\"\1\" 

這樣的參數1(即\ 1)將對應於任何由\分隔(和\)。

2

您需要圍繞您希望捕捉的表達部分放置括號。

s/\'\(.*\)\'/"\1"/ 

但是,您可能會遇到無意的匹配問題。你可以簡單地用文件中的雙引號替換任何單引號?

5

除非我失去了一些東西,不會s/\'/"/g工作?

+0

這是我的妥協,但我覺得它不太對,特別是如果在屬性中有單引號。我不認爲這可能發生在XML中,但它可能發生在需要相同解決方案的道路上。 – ravuya 2010-01-20 17:59:29

+0

單引號屬性中的單引號應該是''',雙引號屬性中的雙引號應該是'"'。當然,單引號可能存在​​於雙引號屬性中,反之亦然...... – ephemient 2010-01-20 18:44:13

1

你有正確的想法 - 你想有"\1"作爲你的替代條款,但你需要首先在捕獲組1中放置「你好」部分(0是整個匹配)。嘗試:

:%/'\(.*\)'/"\1"

13

%s/'\([^']*\)'/"\1"/g

你將要使用的[^']*代替.*否則

'apples' are 'red'將轉換爲:"apples' are 'red"

+1

或者使用'。\ { - }'而不是'。*'。見':help/\ { - '。 – 2012-06-16 10:08:22

48

還有surround.vim,如果你正在尋找經常這樣做。您將使用cs'"來更改周圍的引號。

+0

感謝您使用surround.vim鏈接 - 我一直希望能夠這樣做。 – ThomasH 2011-04-21 08:41:06

+0

有沒有辦法將這個映射到一些領導者命令?我不能這樣做:\ – 2014-01-17 08:26:12

+0

你不應該把它映射到一個領導命令,因爲它使用一個自定義的'cs'運動和兩個參數 - '''作爲目標,'''作爲更換 – kejadlen 2014-01-30 20:02:50

6

只是一個供參考 - 以取代單一的所有雙引號,這是正確的正則表達式 - 基於以上

:%s/"\([^"]*\)"/'\1'/g 
0

rayd09的例子假設你想這樣做對整個文件...

N模式:

ggvG$ [SHIFT+:] 

X模式:

'<,'>/'/" [RET]