2011-09-03 126 views
7

我試圖在vim中使用反向引用和正則表達式進行搜索和替換操作。有趣的是,它只會識別模式,如果我做一個純搜索,但如果我做一個搜索並替換它給了我一個E486:模式找不到錯誤。模式搜索,但不能在vim中搜索和替換?

我有一大堆的形式的函數調用:

function(Nullable<double>(1.1), map[FOO]); 

其中foo是在每行一些不同的變量名。我希望把它變成

function(othermap[ FOO ], map[FOO]); 

如果我嘗試

:%s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g 

它給我的「未發現的錯誤模式。」即使

:%s/Null.*\(map[\)\(.*\)\]//g 

將無法​​正常工作,因爲它只是不識別模式。但是,如果我嘗試使用完全相同的搜索正則表達式執行以下命令:

/Null.*\(map[\)\(.*\)\] 

它正確地突出顯示。在此之後,我可以執行%s // othermap [\ 2],\ 1 \ 2]來替換。所以我終於可以做我的替換,但是我不能理解爲什麼這種模式會在一種情況下被識別,而在另一種情況下卻不會被識別。

+0

的可能的複製[VIM不查找和替換一句簡單的話,這顯然是有](https://stackoverflow.com/questions/5289262/vim -does-not-find-and-replace-simple-phrase-that-is-clearly-present) –

回答

9

我可以使用copy'n'paste從您的問題到我的vim會話重現結果。詳細的消息,我得到的,雖然是:

E486: Pattern not found: Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g 

注意,它已經失去了s/在開始。

然而,仔細而在這看着,麻煩的是一個轉義[

s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g 
      ^
      |-- here; you need \[ to match the literal 

我不使用%符號;我會自動寫入:

:g/Null.*\(map\[\(.*\)\]\)/s//othermap[\2], \1/g 

這與捕獲略有不同。在替換字符串中也不需要使用\]中的反斜槓。

然而,這個命令也適用於我:

:%s/Null.*\(map\[\(.*\)\]\)/othermap[\2], \1/g 
+0

哦,我不知道你必須逃過第一個方括號。方括號的行爲對我來說很奇怪,因爲它在很多情況下似乎都能工作,即使我不逃避它。謝謝! – bhh1988