Imprime texto entre dois padrões que não contêm uma palavra em particular

1

Eu queria imprimir algum texto entre dois padrões que não contenham uma palavra em particular

o texto de entrada é

HEADER asdf asd 
asd COW assd
TAIL sdfsdfs
HEADER asdf asd
sdfsd DOG sdfsdfsdf
TAIL sdfsdfs

HEADER asdf asd
sdfsd MONKEY sdfsdfsdf
TAIL sdfsdfs

a saída necessária é

HEADER asdf asd
asd COW assd
TAIL sdfsdfs

HEADER asdf asd
sdfsd MONKEY sdfsdfsdf
TAIL sdfsdfs

conceitualmente, algo assim é necessário

awk '/HEADER/,!/DOG/,TAIL' text 

Por favor, ajude

    
por user3905367 21.05.2015 / 15:18

2 respostas

2

com perl :

perl -0777 -lne 'print for grep !/DOG/, /^HEADER.*?TAIL.*?\n/mgs' your-file

com awk :

awk '! inside {if (/^HEADER/) {inside = 1; skip = 0; content = ""} else next}
     /DOG/{skip = 1; next}
     ! skip {content=content $0 "\n"}
     /^TAIL/ {if (!skip) printf "%s", content; inside = 0}' your-file
    
por 21.05.2015 / 15:58
2

Se não houver outra limitação aqui, seu script

sed '/^HEADER/{:1;N;/TAIL/!b1;/DOG/d}' text 

Apenas por diversão outras variantes de awk :
um:

awk '
    BEGIN{prn=1}
    /^HEADER/{block=1}
    block{
        if(/DOG/)
            prn=0
        if(!/^TAIL/){
            line=line $0 "\n"
            next
            }
        }
    prn{print line $0}
    /^TAIL/{
        block=0
        prn=1
        line=""
        }
' text

dois:

awk '
    /^HEADER/{
        line=$0
        while(!/TAIL/){
            getline
            line=line "\n" $0
            }
        if(line !~ /DOG/)
            print line
        next
        }
    1' text
    
por 21.05.2015 / 16:44