$ 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",然後仔細查看其結果。