sed -e '/PATTERN/r file' -e '$!N;P;D'
Не работает для PATTERN в последней строке.
С помощью GNU sed
:
sed '/PATTERN/e cat file'
Предполагая, что XML правильно сформирован и не содержит ошибок (, XML в вопросе содержит ошибки )и что Response
является корневым узлом документа, используя 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>
Это вернет вам копию документа, если узел /Response/ParticipantID
имеет значение 12346789
.
Запрос XPATH /Response[ParticipantID="12346789"]
выберет узел Response
, но только если его ParticipantID
имеет указанное значение. Флаг -c
для xmlstarlet
запрашивает копию (, в отличие от -v
, который возвращает значения ).
Так как вы специально просили 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