Это может сработать для вас (GNU sed):
sed -n '/<element>/{:a;/<\/element>/!{N;ba};/<id>12345<\/id>/p}' file
Используйте seds grep-like nature, используя опцию -n
, которая отключает автоматическую печать каждой строки. При обнаружении строки, содержащей <element>
, соберите набор строк, пока не будет достигнут конечный тег </element>
. Теперь проверьте коллекцию на <id>12345</id>
и напечатайте коллекцию, если true, иначе коллекция передана.
Если вместо этого вы хотите определенный элемент, например второе, используйте:
sed -n '/<element>/{:a;/<\/element>/!{N;ba};x;s/^/x/;/^x\{2\}$/{x;p;b};x}' file
Используется счетчик, удерживаемый в области удержания, который увеличивается на каждую полную коллекцию и проверяется на конкретное число.
N.B. Оператор диапазона ,
может использоваться как команда типа триггера, но в целом start address{:a;N;end address!ba; commands on collection}
более полезен.