2015-11-23 4 views
2

Мне нужно извлечь часть данных xml, доступных в stdin, используя сценарий оболочки.Извлечь часть тега xml с помощью Sed

Данные ввода вставляются ниже.

<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

Обратите внимание, что синтаксический анализ XML и другие рекурсивные данные с regexen часто является плохой идеей и надлежащего парсер лучшим решением. (Например: что, если ваша строка поиска встречается где-то, чего вы не ожидали, как в комментарии или как часть строки?) Если вы не знаете об этом, посмотрите.

Одна возможность извлечь все версии после 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 
Смежные вопросы