<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"]
選択しますが、指定された値がある場合にのみ適用されます。フラグにはコピーが必要です(値を返すのではなく)。Response
ParticipantID
-c
xmlstarlet
-v