我已经尝试过 grep、awk、sed,并且开始尝试 xmlstarlet,但我发现它们并没有提供太多支持。
我猜测 xmlstarlet 告诉我 XML 格式不正确,但我想要做的只是找到包含特定十六进制颜色的标签并打印标签之间的文本。
我的 file.xml 如下所示:
<p style=" margin-left: 80.0px;">Do not print this.</p>
<p style=" margin-left: 80.0px;"><span style=" color: #595959;">Print this.</span></p>
我努力了
$ cat file.xml | grep -oP '(?<=\"<span style="color: #595959;">\").*?(?=\"</span>")'
grep 没有输出
sed -n '/span style=" color: #595959/,/<\/span/p' file.xml
sed 返回整行并继续在 xml 文件中打印之后的每一行,但我只想要标签之间的文本。
awk -F "[><]" '/span style=" color: #595959;"’/{print $3} file.xml
awk 命令运行但不会终止或打印任何内容。
xmlstarlet 生成:
Unescaped '<' not allowed in attributes values
它指的是文件中的另一行,但我猜测这种违规行为是 xmlstarlet 停止的原因。
答案1
考虑到file.xml不是正确格式的xml,您可以执行以下操作:
grep -o '<span style=\" color: #595959;">.*</span>' file.xml | xmllint --xpath 'string(//span)' -
该命令的一部分grep
将查找包含所需 span 标记(包括标记)的整行。然后,该行将通过管道传输到 xmllint,后者将使用 xpath 查询来定位您的文本。请记住,如果您在同一行中没有多个符合 grep 条件的 span 标记,这将起作用。
但是,如果您已经正确形成了 xml,则只能使用 xmllint(我只是在文件周围放置了和标签),这是处理 xml 文件的首选方法。命令如下:
xmllint --xpath 'string((//span[@style=" color: #595959;"])[1])' file.xml
注意[1]
命令中的 。这用于显示查询的第一个结果。如果您有多个具有相同样式属性的 span 标签,则可以使用 、 等获取这些[2]
文本[3]
。