如何在bash中移除字符串内HTML标签并提取curl输出的base64内容
问题原因说明
- sed报错:你写的替换
</td>的sed表达式s/</td>//g里,</td>中的/和sed默认的命令分隔符/冲突,sed会把/识别为表达式结束符,后面的td>就会被判定为非法参数。 - xmllint首次报错:你把
cat file | sed '1,1d'的输出内容当成文件名参数传给了xmllint,xmllint误以为每行内容都是要加载的本地文件,所以报加载外部实体失败。 - xmllint返回XPath为空:你写的XPath里的
tbody是浏览器渲染HTML时自动补的标签,原始返回的HTML中没有<tbody>节点,所以路径匹配不到内容。
解决方案
方法1:用sed/grep直接提取(更简单,无需处理HTML结构)
curl -X POST --data-urlencode "data=$DATA" -s http://10.10.11.100/tracker_diRbPr00f314.php \ | grep -A1 '<td>CWE:</td>' \ | tail -n1 \ | sed -e 's/.*<td>//g' -e 's/<\/td>//g' -e 's/[[:space:]]//g'
需要直接解码的话在末尾追加| base64 -d即可。
- 命令逻辑:先过滤出包含
<td>CWE:</td>的行和它的下一行,取第二行(CWE对应值的行),再用sed删除<td>前缀、</td>后缀和所有空白字符。
方法2:用xmllint正确提取
修正XPath去掉不存在的tbody节点,加string()直接取文本内容:
curl -X POST --data-urlencode "data=$DATA" -s http://10.10.11.100/tracker_diRbPr00f314.php \ | sed '1d' \ | xmllint --html --xpath 'string(/table/tr[2]/td[2])' - 2>/dev/null
2>/dev/null用于屏蔽xmllint的非必要警告。
原有sed写法的修正方案
如果你想继续用原来的多步sed写法,只要把sed的命令分隔符换成#等不会和内容冲突的符号即可:
# 错误写法 sed 's/</td>//g' # 正确写法 sed 's#</td>##g'
内容的提问来源于stack exchange,提问作者Jaquarh
相关产品推荐
相关产品推荐

