2011-11-01 129 views
7

我需要用\ <文件名> ... </filename>標籤替換/字符的所有實例。用vim替換標籤之間的所有字符實例

該文件具有2.000這些標籤,我只需要替換這些標籤中的/字符。

我該怎麼辦?

+0

@ewok是什麼使這從另一個數百編輯器不同相關的問題? – deviousdodo

+0

@ewok:vim問題(像這樣的特殊正則表達式問題)正好在常見於「程序員通常使用的軟件工具」類別中,在faq – jkerian

回答

9

編輯:在新的信息,下面的替代可能會工作:

:%s/<filename>\zs.\{-}\ze<\/filename>/\=substitute(submatch(0), '\/', '\', 'g')/ 

釋:

  • %s:整個文件
  • /<filename>替代:啓動模式和靜態的文字匹配
  • \zs:匹配文本的開頭
  • .\{-}:任何字符,非貪婪
  • \ze:匹配的文本
  • <\/filename>/的端:靶向標籤和圖案
  • \=的端:評估更換Vim表達式
  • substitute(submatch(0), '\/', '\', 'g')/:更換所有/\匹配的文本中。

原來的答覆:

我會假設你的意思是XML風格的標籤在這裏。我想要做的是直觀地選擇您想要操作的區域,然後使用\%V正則表達式原子僅對該選擇進行操作。

vit:s!\%V/!\\!g 

應該這樣做。注意,按:時,vim會自動添加一個範圍的視覺選擇,實際替換命令看起來像:

:'<,'>s!\%V/!\\!g 
+0

中明確列爲「on topic」類別,這已經相當成熟了,謝謝,但這隻適用於選擇了實際的標籤,而不是所有的標籤,都這樣做? – Oletros

+0

正確。這是你可能想要在你的問題中更明顯一些的細節。 –

+0

謝謝,它已經像一個魅力:) – Oletros

0

VIM有一個尖銳的學習曲線,因爲這樣做正則表達式的。我相信這個命令會做到這一點。你必須用'\'來轉義每個字符。

:%s/\//\\/g 
+0

謝謝,但這將取代更多/我需要更換,我只需要更換/內< filename > ... – Oletros

+0

哦,我的壞,你只是想要切換標籤中的路徑。我不知道我頭頂的正則表達式;嘗試看看本教程:http://www.thatsquality.com/articles/how-to-match-and-replace-content-between-two-html-tags-using-regular-expressions – Noah

+0

謝謝,我會看看它 – Oletros

2

當且僅當我們可以假設標籤是單線條,它很簡單:

注意輸入^M作爲在Windows上了Cv釐米CQ釐米

:g/<filename>/norm! /filename>/e^Mvity:let @"=substitute(@", '/', '\\', "g")^Mgvp 

嗯上以一定圖案用\%V整合由蘭迪暗示使得它更簡單:

:g/<filename>/norm! /filename>/e^Mvit:s#\%V/#\\#g^M 

我測試兩者。喔。我現在解釋一下。等一下。

  1. :g/<filename>/ - _for含有<filename>
  2. norm!每一行 - _execute正常命令(忽略映射)
  3. /filename/e輸入跳轉到開放標記的末尾
  4. vit - 選擇th的內部文本在可視模式標籤
  5. :s#\%V/#\\#g輸入 - _ON是視覺選擇,執行替換(更換\/
相關問題