grep
não é adequado para esta tarefa, você precisa usar uma ferramenta "para cima":
sed -n '/^B/,/^E/p' infile
Saída:
B
C
D
E
B
C
E
Com relação à enésima exigência, acho que é mais fácil se você avançar novamente uma ferramenta "up", a saber awk:
awk '/^B/ { f = 1; n++ } f && n == wanted; /^E/ { f = 0 }' wanted=2 infile
Saída:
B
C
E
O sinalizador f
será definido quando /^B/
for encontrado e desfeito quando /^E/
ocorrer, da mesma forma que a notação sed funciona. n
mantém um registro de quantos blocos passaram e quando f == 1 && n == wanted
é verdadeiro, o bloco padrão será executado ( { print $0 }
).