特定の単語を含まない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