我想清空每个 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">
我想要得到:
<>Holdrs <><><>
<>
<>25,241<><><>
根据我对 sed 的理解,这应该是:
sed 's/<.*>/<>/'
但它只返回:
<>
<>
<>
(在此处测试:https://sed.js.org/?gist=7af9c1c1762a6a93d582502b3d4fe22f)。
我做错了什么?正确的模式是什么?
答案1
*
是贪婪的,因此匹配行中<.*>
从第一个<
到最后一个的所有内容。有些工具将其理解为非贪婪的类似物,>
*?
*
但不是sed
。
在你的情况下,仍然可以使用sed
。将.
(任何字符) 替换为[^>]
(任何字符,但>
)。你还应该添加g
标志,因为你想替换行中的所有匹配项,而不仅仅是第一个。
这应该有效:
sed 's/<[^>]*>/<>/g'
答案2
只需将所有节点重命名为空字符串并使用删除所有属性xmlstarlet
:
xml ed -r '//*' '' -d '//@*'
这将添加一个 XML 标头 ( <?xml version="1.0"?>
) 并在结束标记 ( </>
) 中留下一个斜线,这可能是可以接受的,或者您可以使用额外的tail
/sed
传递将其删除。
正如其他人已经说过的,sed
单靠自己永远无法正确处理所有情况。