使用Sed提取部分xml标记

时间:2015-11-23 09:18:53

标签: xml sed

我需要使用shell脚本提取stdin中可用的部分xml数据。

输入数据粘贴在下面。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header>
           <ns7:ClientInfoHeader xmlns:ns7="urn:messages.test.example.com/v1" soapenv:mustUnderstand="0">
             <ns7:AppID>example</ns7:AppID>
        </ns7:ClientInfoHeader>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" mustUnderstand="1">
          <wsse:UsernameToken>
              <wsse:Username>testuser</wsse:Username>
          </wsse:UsernameToken>
        </wsse:Security>
    </soapenv:Header>
  <soapenv:Body>
        <ns7:CSV xmlns:ns7="urn:messages.test.example.com/v1">
                    <ns7:Que>SELECT * from Test</ns7:Qu>
        </ns7:CSV>
     </soapenv:Body>
</soapenv:Envelope>

我需要从上面的输入中提取命名空间版本v1。这意味着来自

v1
"urn:messages.test.example.com/v1"

我只能使用Sed实用程序。

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

请注意,使用regexen解析XML和其他递归数据通常是一个坏主意,正确的解析器是更好的解决方案。 (例如:如果您的搜索字符串出现在某个您没想到的地方,如评论或作为字符串的一部分,该怎么办?)如果您不知道这一点,请查阅。

xmlns:ns7="urn.messages.test.example.com/之后提取所有版本的一种可能性,假设版本格式始终是v后跟一个数字:

sed -rne 's/.*xmlns:ns7="urn:messages\.test\.example\.com\/(v[0-9]+)".*/\1/p' input.xml

如果您只需要第一场比赛:

sed -rne '/.*xmlns:ns7="urn:messages\.test\.example\.com\/(v[0-9]+)".*/{s//\1/p;q;}' input.xml