特定の単語を含まない2つのパターンの間にテキストを印刷します。

特定の単語を含まない2つのパターンの間にテキストを印刷します。

特定の単語を含まない2つのパターンの間にいくつかのテキストを印刷したいと思います。

入力テキストは

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

HEADER asdf asd
sdfsd MONKEY sdfsdfsdf
TAIL sdfsdfs

必要な出力は次のとおりです。

HEADER asdf asd
asd COW assd
TAIL sdfsdfs

HEADER asdf asd
sdfsd MONKEY sdfsdfsdf
TAIL sdfsdfs

概念的には、これが必要です。

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

答え1

そしてperl

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

そして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

答え2

ここに他の制限がない場合は、スクリプト

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

ただ楽しい:次の別のバリエーションawk
1:

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

2:

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

関連情報