2010-02-02 42 views
3

我有一個文件有很多< swf ...> ..... </swf>在它。我想刪除所有這些。使用vi時,我鍵入正則表達式搜索和替換在VI

:%s/\<swf[^\/swf>]+\/swf\>//g 

我希望這會工作,但它不匹配任何東西。

回答

8

您可以刪除所有這些從緩衝區用這個命令:

:%s!<swf.\{-}/swf>!! 

如果你也有可能在兩行進行分割的標籤,你可以添加\_修改,使.匹配換行符太:

:%s!<swf\_.\{-}/swf>!! 

這個假設你要刪除這兩個標籤,它們包含,如果你只是想擺脫的標籤,並保持內容是什麼

:%s!</\?swf.\{-}>!! 

注:

  • 你不需要逃避<>
  • 你可以選擇任何模式定界符你想:Vim會使用您在替換命令中s後把第一個字符:這帶走了必要逃避斜線在你的模式

編輯:您的評論

之後延長我的答案
  • 這個酷似/ STRING/REPLACE/g的我只用一個!代替/,這樣我就不必引用反斜槓在模式(見上面我的第二點)
  • 我沒有在結尾處添加g修改,因爲我有:set gdefault在我.vimrc因爲永遠(這意味着在默認情況下,Vim會替代所有匹配的行,而不是僅僅是第一,所以如果還原的/g意思)
  • \{-}是「非常規「*量詞,即它匹配0或更多的前面的原子,但採取儘可能少的e - 這可以幫助您確保您的搜索模式將擴展到第一個「結束標記」而不是最後一個。

HTH

+0

謝謝謝謝,一個可行的治療! 我很好奇,但是如何在不使用/ STRING/REPLACE/g格式的情況下工作? { - }是什麼意思? – ktec 2010-02-03 10:05:50

+0

更新了我的回答,詳細瞭解您的評論 – 2010-02-03 10:20:52

+0

Awsome,非常感謝! – ktec 2010-02-04 00:00:06

3

的這裏的問題是,[]是一個字符類,所以你告訴它的swf開始和結束標記之間,字母swf不能出現在任何地方,以任何順序。

你可以嘗試一個非貪婪的匹配,而不是:

\<swf.\{-}\/swf\> 

注意.不允許換行默認。

雖然我不使用Vim,所以我使用這個guide來發現語法。我希望這是正確的。