2013-01-14 52 views
3

在某些html編輯的基礎上,我想出了需要某些VIM高手的幫助。Vim-sed喜歡標籤或只在模式內更換

我wan't實現簡單的任務 - 我有錯位的URL的HTML文件。

<a href="http://some/wrong/url with variable number of spaces">Just description</a> <a href="http://some/wrong/url with three spaces">Just description</a> 
... 
<a href="http://anoter/wrong/url with completely other number of spaces">Just description</a> 

不幸的是,它不是「每行一個網址」。

我所知道的三種方法:

  1. 我希望能夠只在'"http://[^"]*"'正則表達式替換(類似像只匹配行更換 - 但這次不是整行,但只能匹配模式應該參與)

  2. 或者使用SED-如標籤 - 我可以做的sed -e這個任務:一個-e 's#\("http://[^" ]*\) \([^"]*"\)#\1_\2#g;ta'

  3. 而且我知道有類似"\@<="但我不是母語者,vim手冊對此超出了我的理解範圍。

非常感謝所有幫助。

如果可能的話,我想知道在所有三個問題的答案(因爲這些都是非常有趣的,並會在其他任務有幫助的),但無論是那些會做。

回答

1

我想你想要做的是,以取代所有的空格在您的http:// URL爲_

爲了實現這一目標,@墨爾波墨涅的解決方案是簡單的。你可以在你的vim中嘗試。

在另一方面,如果你想你的模擬線路的sed,你可以嘗試以下。

:let @s=':%s#\("http://[^" ]*\)\@<= #_#g^M' 

^M means Ctrl-V then Enter 

然後

[email protected] 

這部作品在同樣的方式爲您的sed線(標籤,不要更換,回到標籤...)和@<=被使用。

一個問題是,用這種方法,vim無法檢測何時所有匹配模式被替換。因此給出了一個相對大的數字(在我的例子中爲200)。並最終顯示一個錯誤消息「E486:Pattern not found ...」。

需要腳本來避免該消息。

3

回覆:1.您可以通過遞歸結合vim的與substitute功能(:h substitute())取代「評估置換爲表達」功能(:h :s\=):

:%s!"http://[^"]*"!\=substitute(submatch(0), ' ', '_', 'g')!g 

回覆:2我不知道sed所以我不能幫你。

回覆:3。我看不出\@<=將有助於在這裏。至於它的功能:它相當於Perl的(?<=...)功能,也稱爲「積極的後顧之憂」。你可以把它讀作「如果前面有」:即把每一個foobarfooX

:%s/\%(foo\)\@<=bar/X/g 

「如果它是由前foo通過X更換bar」(以下\%(... \)只是在這裏分組)。在Perl你會寫爲:

s/(?<=foo)bar/X/g; 

更多的例子和解釋,可perldoc perlretut找到。