Remove linhas entre 2 tags (com algumas restrições)

1

O arquivo de entrada é assim:

AAAAAAAAAAA
BBBBBBBBBBB
Start
CCCCCCCCCCC
DDDDDDDDDDD
Stop
EEEEEEEEEEE
Stop
Rec
FFFFFFFFFFF
GGGGGGGGGGG
HHHHHHHHHHH
Start
IIIIIIIIIII
JJJJJJJJJJJ
Start
KKKKKKKKKKK
LLLLLLLLLLL
MMMMMMMMMMM
NNNNNNNNNNN
Stop
Rec
OOOOOOOOOOO
PPPPPPPPPPP
QQQQQQQQQQQ
RRRRRRRRRRR
SSSSSSSSSSS
TTTTTTTTTTT
UUUUUUUUUUU
VVVVVVVVVVV
Start
WWWWWWWWWWW
XXXXXXXXXXX
YYYYYYYYYYY
ZZZZZZZZZZZ

Saída desejada:

AAAAAAAAAAA
BBBBBBBBBBB
FFFFFFFFFFF
GGGGGGGGGGG
HHHHHHHHHHH
Start
IIIIIIIIIII
JJJJJJJJJJJ
OOOOOOOOOOO
PPPPPPPPPPP
QQQQQQQQQQQ
RRRRRRRRRRR
SSSSSSSSSSS
TTTTTTTTTTT
UUUUUUUUUUU
VVVVVVVVVVV
Start
WWWWWWWWWWW
XXXXXXXXXXX
YYYYYYYYYYY
ZZZZZZZZZZZ

Eu quero remover todas as linhas entre as tags Start e tags Stop\nRec (tags incluídas). A seqüência Start - Stop\nRec pode aparecer muitas vezes em um arquivo longo. AAAAAA , BBBBBB , ...ZZZZZZ linhas podem ser qualquer coisa. As tags ( Start e Stop\nRec ) não compartilham a linha com os dados (ou seja, devem ser pesquisadas como ^tag$ . A tag final Stop\nRec precisa ser tag de 2 linhas.

Mas, quando vários Start são encontrados antes de ser encontrado Stop\nRec , a supressão só deve ser aplicada a partir do último Start encontrado antes do Stop\nRec (no exemplo, as linhas IIIIIII e JJJJJJJ são mantido).

E, no final do arquivo, quando uma tag Start é encontrada, mas nenhuma tag Stop\nRec , as linhas entre esse Start e o final do arquivo devem ser mantidas (por exemplo, linhas Start WWWWWW XXXXXX YYYYYY ZZZZZZ são mantidos).

Eu quero fazer este retrabalho com sed (rodando sob o shell bash no Linux) e usando a opção -i (mesmo arquivo para entrada e saída).

Eu fiz o seguinte, mas ele não funciona corretamente (especialmente quando vários tag Start são encontrados antes de uma tag Stop \ nRec ser alcançada):

sed -i '/^Start\n/ {:a; $!{ N ; /\nStop\nRec$/!ba } s/.*// }' file.txt

Agradecemos antecipadamente por sua ajuda.

    
por Syl87 06.07.2016 / 14:31

2 respostas

0

Isso parece funcionar:

${H;x;p;q}
/Start/ {x;s/^\n//;p;d}
{H;N}
/Stop\nRec/ {s/.*//;h;d}
D
    
por 06.07.2016 / 17:20
0

Tente testar

sed '
    /Start/! b
    :a
    /\nStart$/{
        P
        D
    }
    N
    $b
    /Stop\nRec/! ba
    d
' Input.file
    
por 06.07.2016 / 19:41