perl . > .
sed .
. , GB. , ( CASE3).
: CASE3 (. ). CASE3 .
1: awk - script, . , , . (CASE3 ):
awk 'BEGIN{p=1;l1=l2=""}
(NR>2) && p {print l1}
{ p=!(l1~/bar/&&l2~/foo/&&/baz/);
l1=l2;l2=$0
}
END{if (l1!="" && p) print l1
if (l2!="" ) print l2}' <file>
, 3 , l1, l2 $0. , l1 . NR=3 . : l1 bar, l2 foo $0 baz, .
2: A sed, , . sed . - , , - . , print , ( x)
sed '1{x;s/^.*$/print/;x;N};
N;
x;/print/{z;x;P;x};x;
/bar.*\n.*foo.*\n.*baz/!{x;s/^.*$/print/;x};
$s/\(bar.*\)\n.*foo.*\n\(.*baz\)/\1\n\2/;
D' <file>
- line
#1 , print (x;s...;x) (N) #2- line
#3 , , P \n , z #4 , . , , print#5,#6 \n #1 .
.
comment: , , : s/^/P:/;l;s/^P://;x;s/^/H:/;l;s/^H://;x. P:, H: .
:
<CASE0 :: default case>
bar
foo (*)
baz
<CASE1 :: reset cycle on second line>
bar
foobar
foo (*)
baz
<CASE2 :: start cycle at end of previous cycle>
bar
foo (*)
bazbar
foo (*)
baz
<CASE3 :: nested cases>
bar
foobar (*)
foobaz (*)
baz
<CASE4 :: end-of-file case>
bar
foo
: (, , )
awk: CASE3
awk '!/baz/&&(c==2){print foo}
/bar/ {c=1;print;next}
/foo/ &&(c==1){c++;foo=$0;next}
{c=0;print}
END{if(c==2){print foo}}' <file>
, , foo, , bar. , foo .
!/baz/&&(c==2){print foo}: . bar-foo baz, foo.
/bar/{c=1;print;next}: . bar, c 1, . bar . CASE1 CASE2.
/foo/&&(c==1){c++;foo=$0;next}: bar-foo. foo .
{c=0;print}, , , bar bar-foo. reset .
END{if(c==2){print foo}} CASE4
gawk: CASE3
awk 'BEGIN{ORS="";RS="bar[^\n]*\n[^\n]*foo[^\n]*\n[^\n]*baz"}
{sub(/\n[^\n]*foo[^\n]*\n/,"\n",RT); print $0 RT}' <file>
RS bar[^\n]*\n[^\n]*foo[^\n]*\n[^\n]*baz, . [^\n]*\n[^\n]* , \n, RS bar-foo-baz. RT sub, foo .
RT ( gawk) , , RS, . , .
sed: CASE1, CASE2, CASE3, CASE4
sed -n '/bar/{N;/\n.*foo/{N;/foo.*\n.*baz[^\n]*$/{s/\n.*foo.*\n/\n/}}};p' <file>
/bar/{N;...} bar, (N)/\n.*foo/{N;...}, foo , (N)/foo.*\n.*baz[^\n]*$/{s/\n.*foo.*\n/\n/}, foo, , , baz, , foo. barfoo\nfoobaz\ncar