タグの1つでパターンマッチング後にsedを使用してxmlから抽出するにはどうすればよいですか?

タグの1つでパターンマッチング後にsedを使用してxmlから抽出するにはどうすればよいですか?
<Response 
            <MessageID>ID:c3e2</MessageID>
             <Year>2018</Year>
            <ClntID>ABC</ClntID>
            <ParticipantID>12346789</ParticipantID>
            <ProductType>RU</ProductType>
           <Date>19010101<tDate>
          </Response>

上記の応答では、参加者IDの値が12346789の場合にのみ、応答全体をコピーしたいと思います。 sedまたはgrepコマンドを使用してこれを達成するにはどうすればよいですか?

答え1

特に要請されたので、sedそうしてください。

$ 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>
$

同様のコードsed - 行が条件に一致すると、パターン範囲に一致する行を印刷します。@John1024経由

答え2

XMLが正しい形式であり、エラーがなく(質問のXMLにエラーがある)、これがResponse文書のルートノードであるとし、次のようにします。XMLスター:

$ 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>

/Response/ParticipantIDノード値がある場合、文書のコピーが返されます12346789

XPATHクエリはノードを/Response[ParticipantID="12346789"]選択しますが、指定された値がある場合にのみ適用されます。フラグにはコピーが必要です(値を返すのではなく)。ResponseParticipantID-cxmlstarlet-v

関連情報