2011-02-07 20 views
1

我想在文本片段來代替,如:更換_到 - 使用sed,但僅在HREF屬性

<strong>Media Event &quot;New Treatment Options on November 4&ndash;5, 2010, in Paris, France<br /></strong><a href="/news/electronic_press_kits/company_media_event_trap_eye.php">&gt;&gt; more</a> 

全部用破折號下劃線。但僅限於href屬性。由於有數百個文件,最好的方法是使用sed或一個小的shell腳本處理這些文件。

我開始與

\shref=\"([^_].+?)([_].+?)\" 

但這只是1相匹配_,我不知道的_數量和我stucked如何動態地可以在一個未知數量的反向引用的替換下劃線。

回答

1

多數民衆贊成對具體使用HTML面向的工具是目前爲止最好,因爲試圖用正則表達式可導致madness它的工作。

但是,假設只有一個href每行,你也許能夠使用這種分而治之法:

sed 's/\(.*href="\)\([^"]*\)\(".*\)/\1\n\2\n\3/;:a;s/\(\n.*\)_\(.*\n\)/\1-\2/;ta;s/\n//g' inputfile 

說明:

  • s/\(.*href="\)\([^"]*\)\(".*\)/\1\n\2\n\3/ - 把周圍的換行符內容href
  • :a;s/\(\n[^\n]*\)_\([^\n]*\n\)/\1-\2/;ta - 在換行符之間的文本中逐個替換下劃線,t分支到標籤:a如果替換作出
  • s/\n//g - 刪除第一步
+0

很多很多THX丹尼斯加入新行,運行完美,我從來沒有發現,表達 – Boris 2011-02-08 13:30:09

1

正則表達式根本上是這項工作的錯誤工具。有太多必須匹配的上下文。

相反,你需要寫一些逐個字符的東西,有兩種模式:一種是複製所有輸入,另一種是用短劃線替換下劃線。在查找href開始時,它進入第二種模式,在離開href時它返回到第一個模式。這實質上是一個標記器的有限形式。