
我正在將<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