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

use*_*915 5 command-line text-processing

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

Joh*_*024 6

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

$ echo '<B> BBB B' | sed 's/\<B\>/STRONG/g'
<STRONG> BBB STRONG
Run Code Online (Sandbox Code Playgroud)

\<B\>匹配B在上述字符串中出现两次的单词。因为它匹配单词B而不是尖括号,所以尖括号保持不变。

如果要匹配尖括号, <>,请关闭反斜杠:

$ echo '<B> BBB B' | sed 's/<B>/<STRONG>/g'
<STRONG> BBB B
Run Code Online (Sandbox Code Playgroud)

<B>匹配左尖括号,B后跟右尖括号。因此,<B>被替换为<STRONG>B被留下。

捕获打开和关闭标签

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

-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>
Run Code Online (Sandbox Code Playgroud)


mur*_*uru 5

<并且>不是Basic Regular Expressions 中的特殊字符,所以它们不应该被转义。当您转义它们时,sed将尝试将它们视为特殊字符,然后行为未定义

以 a ( '\' ) 开头的普通字符的解释是未定义的,除了:

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

$ echo 'b<b>' | sed 's/<b>/strong/'  
bstrong
Run Code Online (Sandbox Code Playgroud)

  • @user2280915 在您的情况下,可能所有的`B` 都必须被`STRONG` 替换。 (2认同)