Para o seu caso em particular, isso funcionará:
sed '
/C/,/E/ {
s/[CD]/&/
t s
s/E.*/&\
X1\
X2/
t e
H
:s
d
:e
p
x
D
}
/F/d
/G/c\
Y1\
Y2
' file
Alguém mais inteligente do que eu pode ser capaz de fazer isso de uma forma mais simples - observe que isso deve lidar com o caso em que há outras linhas além de D entre C e E . Isso pressupõe, no entanto, que as linhas A , B , ... sejam classificadas, ou seja, sem G entre C e D .
Geralmente, casos como esse são feitos muito mais obviamente com ed ou ex :
$ cat <<EOT | ed -s file
/E/m/C/-1
g/D/d
g/F/d
/C/c
X1
X2
.
/G/c
Y1
Y2
.
w
EOT
$ cat file
A
B
E
X1
X2
Y1
Y2
O comando /PAT1/m/PAT2/-1 moverá a linha correspondente a PAT1 antes da linha corresponder a PAT2 .
O comando /PAT/c alterará a linha correspondente a PAT para as seguintes linhas terminadas por . .
O comando g/PAT/d irá para todas as linhas correspondentes a PAT e as excluirá.
Alterei a ordem das operações com base nas sugestões do @ don_crissti, para tornar o exemplo um pouco mais geral (manipule o caso em que as linhas X1 , Y1 inseridas podem corresponder ao /D/ ou /F/ padrões).