使用 sed 过滤掉 html 标签并用其他 html 标签替换

使用 sed 过滤掉 html 标签并用其他 html 标签替换

我在文件中用<B>和替换</B><STRONG>。这有点像替换 hmtl 标签。我用了。它完成了工作,但如果文件中存在 和 。那么它们也会被更改为和。我不明白这背后的逻辑。</STRONG>sed 's/\<B\>/STRONG/g'[B][/B][STRONG][/STRONG]

答案1

默认情况下,sed 使用基本正则表达式。这意味着 GNU lets\<匹配单词的开头和\>结尾。观察:

$ 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>B保留原样。

捕捉开始和结束标签

$ 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将尝试将其视为特殊字符,然后行为是不明确的

对于以 ('\') 开头的普通字符的解释是未定义的,但以下情况除外:

因此,只需使用<且不>转义:

$ 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

相关内容