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).