使用 sed 過濾掉 html 標籤並替換為其他 html 標籤

使用 sed 過濾掉 html 標籤並替換為其他 html 標籤

我正在將<B>and替換</B>為文件中的<STRONG>and 。</STRONG>這有點像是替換 hmtl 標籤。我用了sed 's/\<B\>/STRONG/g'。它完成了工作,但如果在文件中[B]並且[/B]存在的話。然後它們也變成[STRONG][/STRONG]。我不明白背後的邏輯。

答案1

預設情況下,sed 使用基本正規表示式。這意味著 GNU 可以\<匹配單字的開頭和\>單字的結尾。觀察:

$ echo '<B> BBB B' | sed 's/\<B\>/STRONG/g'
<STRONG> BBB STRONG

\<B\>B符合上面字串中出現兩次的單字。因為它匹配單字B而不是尖括號,所以尖括號保持不變。

如果要符合尖括號,<>請保留反斜線:

$ echo '<B> BBB B' | sed 's/<B>/<STRONG>/g'
<STRONG> BBB B

<B>匹配左尖括號,後面跟著B右尖括號。因此,<B>被替換為<STRONG>butB被保留。

捕獲開始和結束標籤

$ echo '<B> BBB B </B>' | sed -r 's|<(/)?B>|<\1STRONG>|g'
<STRONG> BBB B </STRONG>

-r用於擴展正則表達式,但最新版本的 GNU sed 也支援-E作為-r. BSD sed-E為此使用,據報道,未來的 POSIX 標準已採用-E.因此,為了相容性,人們可能想要使用(帽子提示@Kos):

$ echo '<B> BBB B </B>' | sed -E 's|<(/)?B>|<\1STRONG>|g'
<STRONG> BBB B </STRONG>

答案2

<並且>不是特殊字符基本正規表示式,所以他們不應該被逃脫。當你逃避它們時,sed會嘗試將它們視為特殊字符,然後的行為是不明確的:

前面帶有 ( '\' ) 的普通字符的解釋是未定義的,除了:

  • 字元“)”、“(”、“{”和“}”
  • 數字 1 到 9(含)(參見匹配多個字元的 BRE
  • 括號表達式內的字符

因此,只需使用<並且>無需轉義:

$ echo 'b<b>' | sed 's/<b>/strong/'  
bstrong

答案3

解決方案與awk.這裡我有一個範例文件,其中包含兩行標籤並使用gsub函數來替換它們。然後我們將其輸出到臨時檔案並返回到原始檔案。完成後刪除臨時檔案。根據需要進行調整。

$ cat tags.txt                                                                                                                                      
<B> and </B>
<B> or </B>

$ awk '{gsub("<B>","<STRONG>"); gsub("</B>","</STRONG>");print}' tags.txt                                                                           
<STRONG> and </STRONG>
<STRONG> or </STRONG>

$ awk '{gsub("<B>","<STRONG>"); gsub("</B>","</STRONG>");print}' tags.txt > tmpfile.txt && cat tmpfile > tags.txt

相關內容