sed 匹配最短模式的方法

目前爲止,我們只執行了簡單的字符串替換。雖然這很方便,但是我們還可以匹配規則表達式。例如,以下 sed 命令將匹配從 '<' 開始、到 '>' 結束、並且在其中包含任意數量字符的短語。下例將刪除該短語(用空字符串替換):
  $ sed -e 's/<.*>//g' myfile.html 
  這是要從文件除去 HTML 標記的第一個很好的 sed 腳本嘗試,但是由於規則表達式的特有規則,它不會很好地工作。原因何在?當 sed 試圖在行中匹配規則表達式時,它要在行中查找最長的匹配。在我的前一篇 sed 文章中,這不成問題,因爲我們使用的是 'd' 和 'p' 命令,這些命令總要刪除或打印整行。但是,在使用 's///' 命令時,確實有很大不同,因爲規則表達式匹配的整個部分將被目標字符串替換,或者,在本例中,被刪除。這意味着,上例將把下行:
  <b>This</b> is what <b>I</b> meant. 
  變成: 
  meant. 
  我們要的不是這個,而是: 
  This is what I meant. 

  幸運的是,有一種簡便方法來糾正該問題。我們不輸入“'<' 字符後面跟有一些字符並以 '>' 字符結束”的規則表達式,而只需輸入一個“'<' 字符後面跟有任意數量非 '>' 字符並以 '>' 字符結束”的規則表達式。這將與最短、而不是最長的可能性匹配。

新命令如下:

  $ sed -e 's/<[^>]*>//g' myfile.html 
  在上例中,'[^>]' 指定“非 '>'”字符,其後的 '*' 完成該表達式以表示“零或多個非 '>' 字符”。對幾個 html 文件測試該命令,將它們管道輸出到 "more",然後仔細查看其結果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章