我需要使用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实用程序。
非常感谢您的帮助
答案 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