<Response
<MessageID>ID:c3e2</MessageID>
<Year>2018</Year>
<ClntID>ABC</ClntID>
<ParticipantID>12346789</ParticipantID>
<ProductType>RU</ProductType>
<Date>19010101<tDate>
</Response>
在上面的响应中,我想复制完整的响应,只有当participantID的值为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
返回值)。