Talvez este script sed GNU funcione para você:
sed '/<item_id>6<\/item_id>/{:1;n;/<item_id>[^6]<\/item_id>/{Q};b1};d' file
Continue excluindo d
linhas até encontrar uma linha 6
e, em seguida, mantenha o loop interno b1
imprimindo cada linha até que uma linha not 6
([^ 6]) seja encontrada, quando o script é Q
uit.
Entenda que isso funciona apenas para números de um caractere (o 6
ou o 9
).
Fica um pouco confuso para que funcione com qualquer número (GNU):
sed -e 'h;s,<item_id>\([0-9]*\)<\/item_id>,,;/^6$/!d;/^6$/{g;:1;h;s,<item_id>\([0-9]*\)<\/item_id>,,;t2;:3;g;n;b1};d;b;:2;/^6$/!Q;b3' file
Usar um par de vars torna isso um pouco melhor, mas não tanto
reg='<item_id>\([0-9]*\)<\/item_id>'
item='6'
sed -e "h;s,$reg,,;/^$item$/!d;/^$item$/{g;:1;h;s,$reg,,;t2;:3;g;n;b1};d;b;:2;/^$item$/!Q;b3" file
E um POSIXfyed parece sem sentido:
sed -ne 'h;s,<item_id>\([0-9]*\)<\/item_id>,,;/^6$/!d;/^6$/{g;:1;h;s,<item_id>\([0-9]*\)<\/item_id>,,;t2;:3;g;p;n;b1;};d;b;:2;/^6$/!q;b3' file
Apenas este código estendido pode (?) ser mais legível:
reg='<item_id>\([0-9]*\)<\/item_id>'
item='6'
sed -ne 'h; # hold copy of line being processed.
s,'"$reg"',,; # extract included number.
/^'"$item"'$/!d; # Not the correct number?: get next line.
/^'"$item"'$/{
g; # restore line from hold buffer.
:1
h; # store successive lines in hold buffer.
s,'"$reg"',,; # extract the number (again).
t2
:3
g; # restore the line back from hold buffer.
p; # print the line.
n; # go to process next line.
b1
}; # end of loop.
d; # avoid printing this last line.
q; # quit the sed script.
:2
/^'"$item"'$/!q; # Test if the number is the one selected.
b3
' file
Talvez você deva usar outro idioma ou ferramenta.