Como usar o sed para extrair do xml depois de fazer uma correspondência de padrão em uma das tags dentro?

-2
<Response 
            <MessageID>ID:c3e2</MessageID>
             <Year>2018</Year>
            <ClntID>ABC</ClntID>
            <ParticipantID>12346789</ParticipantID>
            <ProductType>RU</ProductType>
           <Date>19010101<tDate>
          </Response>

Na resposta acima, eu quero copiar a resposta completa, apenas se o valor de participantID for 12346789. Como posso conseguir isso com o comando sed ou grep?

    
por Shri 03.08.2018 / 18:20

2 respostas

2

Como você solicitou especificamente sed , aqui vai.

$ sed -n '/^<Response/{:a;N;/<\/Response>/!ba;/<ParticipantID>12346789/p}' inp
<Response
            <MessageID>ID:c3e2</MessageID>
             <Year>2018</Year>
            <ClntID>ABC</ClntID>
            <ParticipantID>12346789</ParticipantID>
            <ProductType>RU</ProductType>
           <Date>19010101<tDate>
          </Response>
$

Código semelhante a sed - Linhas de impressão combinadas por um intervalo de padrões se uma linha corresponder a uma condição de @ John1024

    
por 03.08.2018 / 18:40
1

Supondo que o XML esteja bem formado e sem erros (o XML na pergunta possui erros), e que Response é o nó raiz do documento, usando XMLStarlet :

$ xmlstarlet sel -t -c '/Response[ParticipantID="12346789"]' -nl file.xml
<Response>
            <MessageID>ID:c3e2</MessageID>
             <Year>2018</Year>
            <ClntID>ABC</ClntID>
            <ParticipantID>12346789</ParticipantID>
            <ProductType>RU</ProductType>
           <Date>19010101</Date>
          </Response>

Isso retornará uma cópia do documento se o nó /Response/ParticipantID tiver um valor de 12346789 .

A consulta XPATH /Response[ParticipantID="12346789"] selecionará o nó Response , mas somente se seu ParticipantID tiver o valor especificado. O sinal -c to xmlstarlet pede uma cópia (em oposição a -v , que retornaria os valores).

    
por 03.08.2018 / 18:25

Tags