使用xmlstarlet与XPath替换XML节点中的HTML实体
解决xmlstarlet处理HTML实体转义的shell报错问题
错误原因
你遇到的zsh: command not found: lt错误,是因为shell把命令中的&识别成了后台执行标记,后续的lt被当作独立命令执行,导致找不到该命令。核心问题是没有正确转义XML实体字符串,让shell不解析这些特殊字符,同时让xmlstarlet能正确识别处理。
解决方案
使用xmlstarlet的ed(编辑)命令,结合XPath的replace函数,通过单引号包裹XPath表达式避免shell解析特殊字符,完成实体替换:
xmlstarlet ed -u "//content[@type='html']" -x "replace(replace(., '&lt;', '<'), '&gt;', '>')" input.xml > output.xml
命令说明
-u "//content[@type='html']":定位到所有type='html'的content节点-x "replace(...):用XPath的嵌套replace函数,先将&lt;替换为<,再将&gt;替换为>- 用单引号包裹XPath表达式,确保shell不会解析其中的
&等特殊字符,直接传递给xmlstarlet处理
替代写法(转义&字符)
如果不想用单引号,也可以对每个&加反斜杠转义,让shell不把它当作后台标记:
xmlstarlet ed -u "//content[@type='html']" -x "replace(replace(., '\&\<', '<'), '\&\>', '>')" input.xml > output.xml
执行上述命令后,input.xml中content节点内的&lt;和&gt;会被替换为实际的<和>,结果保存到output.xml。
内容的提问来源于stack exchange,提问作者user5853892
相关产品推荐
相关产品推荐

