如何在Shell脚本中检索xml属性?

时间:2018-08-22 15:55:05

标签: xml bash

想象一下,我在shell脚本中有一个包含XML字符串的变量。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smil systemRequired="pss6" xmlns="http://www.w3.org/2001/SMIL20/Language" 
                            xmlns:pss6="http://www.3gpp.org/SMIL20/PSS6/">
    <head>
        <meta id="meta-smil1.0-a" name="Publisher" content="OMA"/>
        <layout>
            <root-layout width="100%" height="100%"/>
            <region id="UP" top="0%" left="0%" height="50%" width="100%" fit="meet" backgroundColor="white"/>
            <region id="DOWN" top="50%" left="0%" height="50%" width="100%" fit="meet" backgroundColor="white"/>
            <region id="FULL" top="0%" left="0%" height="100%" width="100%" fit="meet" backgroundColor="white"/>
        </layout>
    </head>
    <body>
        <par index="0" dur="10" size="29201">
            <img src="b964bdb7-1756-4c41-b3ba-6b2aeb1f5f96" region="DOWN" fill="freeze" size="12473"/>
            <text src="test [url]" region="UP" size="10"/>
            <audio src="88f6111c-f260-4042-8366-76a9e4c44417" size="16718"/>
        </par>
    </body>
</smil>

我想检索<image><audio>标签的src属性值,因此我希望输出如下所示

b964bdb7-1756-4c41-b3ba-6b2aeb1f5f96
88f6111c-f260-4042-8366-76a9e4c44417

1 个答案:

答案 0 :(得分:0)

这是一个可能满足您需求的快速解决方案(我认为XML文件位于file.xml中,而不是变量中):

cat file.xml | tr "<" "\n" | grep -E "^(img|audio)" | sed -Ee "s/^.*src=\"([^\"]+)\".*$/\1/g"
  • tr "<" "\n":确保每个HTML标签都位于单独的行中(<同时被删除,但这不是问题,因为我们希望最后将其删除) li>
  • grep -E "^(img|audio)":仅保留imgaudio
  • sed -Ee "s/^.*src=\"([^\"]+)\".*$/\1/g":删除... src="之前和"...之后的字符串,以便仅保留src内容(正则表达式的捕获组#1)

一旦执行grep命令,我们将得到以下结果:

img src="b964bdb7-1756-4c41-b3ba-6b2aeb1f5f96" region="DOWN" fill="freeze" size="12473"/>
audio src="88f6111c-f260-4042-8366-76a9e4c44417" size="16718"/>

执行sed命令后,我们将获得您期望的结果:

b964bdb7-1756-4c41-b3ba-6b2aeb1f5f96
88f6111c-f260-4042-8366-76a9e4c44417