使用 sed 清空 HTML 标签

Fab*_*ien 8 html sed

我想清空每个 HTML 标签的内容,但“保留结构”

从:

<h5>Holdrs <div class="tooltip" data-tooltip="Accounts with ..."></div></h5>
<div class="value">
  <span class="amount">25,241</span><a class="smallnav" href="/c/token/0xB31f66AA3C1e785363F0875A1B7"><svg class="icon-s icon">
Run Code Online (Sandbox Code Playgroud)

我想得到:

<>Holdrs <><><>
<>
  <>25,241<><><>
Run Code Online (Sandbox Code Playgroud)

根据我对 sed 的理解,这应该是:

sed 's/<.*>/<>/'
Run Code Online (Sandbox Code Playgroud)

但它只返回:

sed 's/<.*>/<>/'
Run Code Online (Sandbox Code Playgroud)

(在这里测试:https://sed.js.org/? gist=7af9c1c1762a6a93d582502b3d4fe22f)。

我做错了什么?正确的模式是什么?

Kam*_*ski 14

*是贪婪的,所以匹配行中<.*>从第一个<到最后一个的所有内容。>有些工具理解*?为 的非贪婪类似物*但不是sed

在你的情况下,人们仍然可以选择sed. 将.(任何字符)替换为[^>](除 之外的任何字符>)。您还应该添加g标志,因为您想要替换行中的所有匹配项,而不仅仅是第一个。

这应该有效:

sed 's/<[^>]*>/<>/g'
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果 HTML 属性或 HTML 节点(如 JavaScript 片段)中存在任何“&lt;”或“&gt;”,则此操作将不起作用。 (14认同)
  • 我认为这也会破坏多行标签:`&lt;tag value="line1\nline2"/&gt;` (4认同)
  • 或者`&lt;![CDATA[]]&gt;`。_生成_ XML 相当简单,但解析则不然。 (4认同)
  • 不要忘记 sed 不理解为被注释掉的注释掉标签。http://htmlparsing.com/regexes.html (3认同)

Dmi*_*yev 9

只需将所有节点重命名为空字符串并使用以下命令删除所有属性xmlstarlet

xml ed -r '//*' '' -d '//@*'
Run Code Online (Sandbox Code Playgroud)

这将添加一个 XML 标头 ( <?xml version="1.0"?>) 并在结束标记 ( ) 中留下斜线</>,这可能是可以接受的,或者您可以通过附加tail/sed传递将其删除。

正如其他人已经说过的那样,sed仅凭一己之力永远无法正确处理所有情况。