2014-12-04 32 views
1

我知道我們對此有許多問題(和答案),但直到現在我無法解決我的問題。我只需要在同一行執行這些命令(以及其他的):在VIM中執行多個%s命令總是給我錯誤E488:尾隨字符

%s/request_snapshot\zs\s*=\s*true/ = false 
%s/primary_dev\zs\s*=\s*"[^"]*"/ = "vnic" 

我已經嘗試過:

%s/request_snapshot\zs\s*=\s*true/ = false | %s/primary_dev\zs\s*=\s*"[^"]*"/ = "vnic" 
%s#request_snapshot\zs\s*=\s*true# = false | %s#primary_dev\zs\s*=\s*"[^"]*"# = "vnic" 
%s#request_snapshot\zs\s*=\s*true# = false \| %s#primary_dev\zs\s*=\s*"[^"]*"# = "vnic" 

並沒有什麼。一個非常好的答案是不用擔心用其他字符替換「/」,因爲我需要執行很多命令,這將會非常痛苦。

回答

3

單個替換命令不需要最後的分隔符(通常是斜槓,/),因爲它可以假定。當你使用|執行多個命令時,你需要確保你有最後的分隔符。

:%s/foo/bar 
:%s/hello/world 

將成爲:

:%s/foo/bar/e | %s/hello/world/e 

注:我還添加了e標誌,如果不發生替換,因爲這會阻止管道從而抑制錯誤。

因此,最終的命令如下:

%s/request_snapshot\zs\s*=\s*true/ = false/e | %s/primary_dev\zs\s*=\s*"[^"]*"/ = "vnic"/e 
+0

這兩個答案都非常好,但我喜歡的「E」選項。非常感謝你和FDinoff。在我要研究函數以檢查如何將所有內容放在那裏之後。 – 2014-12-04 14:12:27

3

最簡單的解決方案是創建一個函數,然後調用該函數。既然你可以把每個替代命令放在自己的路線上。

如果您確實想鏈接它們,您必須終止替代命令。

%s/request_snapshot\zs\s*=\s*true/ = false/ 

通過在每個替換的末尾放置尾部斜線(分隔符)。

所以

%s/request_snapshot\zs\s*=\s*true/ = false/ | %s/primary_dev\zs\s*=\s*"[^"]*"/ = "vnic" 
             ^

將是可以鏈接的有效替代。

你原來認爲它有拖尾字符的原因是管道不會結束替換。 %s之後的斜線結束替換。而primary_dev\zs\s*=\s*"[^"]*"/ = "vnic"不構成有效標誌。