在其中一个标签中进行模式匹配后,如何使用 sed 从 xml 中提取?

在其中一个标签中进行模式匹配后,如何使用 sed 从 xml 中提取?
<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返回值)。

相关内容