如何使用 sed 删除所有 HTML 标签?

如何使用 sed 删除所有 HTML 标签?

我发现了一个非常棒的教程解释一些实际sed例子。

最后一个(编号 10)如下所示:

$ sed -e 's/<[^>]*>//g'
This <b> is </b> an <i>example</i>.
This  is  an example.

有人可以帮我解决这个问题吗?

总结一下我的处境: 1.我理解 :s/x/y/g是一个命令,告诉 sed “用正则表达式全局替换正x则表达式y 2. 看起来该-e标志将 sed 置于某种“交互模式”,从页面man

-e command
             Append the editing commands specified by the command argument to
             the list of commands.

这对我来说似乎很困惑,因为我们似乎没有给出sed一个“命令列表”,而似乎我们给出了一个“参数列表”,所以我不确定这一点。 3.我知道第一个也是唯一一个<只不过是单个字符正则表达式<,最后一个>也只不过是单个字符正则表达式> 4.我知道 sed*告诉 sed 匹配它之前的模式的 0 次或多次出现,在这种情况下,它位于括号内;然而,这就是我真正困惑的地方:有人可以[^>]*为我打开更多东西吗?

所以我真正困惑的是:

  • 用简单的英语来说是怎么回事-e
  • 这是怎么回事[^>]*

谢谢 :)

答案1

该序列s/<[^>]*>//g是一个命令sed处理引擎;它告诉它执行“搜索和替换”。因此-e 's/..../g'意味着“将此搜索和替换命令添加到sed.

如果我们在一个命令中执行多个命令,这可能更有意义:

sed -e '1d' -e '$d'

将在sed处理中添加两个命令; “删除第一行”和“删除最后一行”。

[^>]一个正则表达式,意思是“除了>

所以[^>]*意味着“零个或多个任何字符,除了>

so<[^>]*>表示 a <,可选地后跟 non- >,后跟>

然后我们将其放入“搜索和替换”命令中,其中该序列不被任何内容替换,并且然后在一行中重复多次(最后一次g)。

这意味着该字符串hello <abc> there <def>将首先匹配<abc><,然后abc匹配“零个或多个非>”,然后是>)并将其替换为空,然后对 重做此操作<def>。结果将是hello there

(请注意多余的空格,因为我们不会删除它们!)

答案2

将范围限制为两点:

  • 告诉-esed后面有一个编辑命令

  • [^>]*一个匹配零个或多个字符的模式,这些字符可以是除>特点

编辑命令说

's/<[^>]*>//g'

更改任何匹配的内容<,后跟任意数量的字符,直到第一个>没有什么。并且只要有匹配就重复多次。

相关内容