perl -ne '}{ print $.' # count lines #### perl -ne 'BEGIN{$_=shift for$B,$A,$p}/$p/and@l=(),do{<>for 1..$A},next;push@l,$_;print shift@l if$B<@l}{print@l' 3 5 pattern test.txt #### sub BEGIN { ($_ = shift(@ARGV)) foreach (($B, $A, $p)); } LINE: while (defined(($_ = ))) { (/pat/ and ((@l = ()), do { foreach (1 .. $A) }, next)); push(@l, $_); (($B < @l) and print(shift(@l))); } { print(@l); } #### keep 1 keep 2 keep 3 keep 4 delete 1 delete 2 delete 3 pattern delete 1 delete 2 delete 3 delete 4 delete 5 keep 5 keep 6 keep 7 keep 8 keep 9 keep 10 keep 11 delete 1 delete 2 delete 3 pattern delete 1 delete 2 delete 3 delete 4 delete 5 keep 12 keep 13 keep 14 keep 15 delete 1 delete 2 delete 3 pattern delete 1 delete 2 delete 3 delete 4 delete 5 keep 16 keep 17 keep 18 keep 19 delete 1 delete 2 delete 3 pattern delete 1 delete 2 delete 3 delete 4 delete 5 keep 20 keep 21 #### keep 1 keep 2 keep 3 keep 4 keep 5 keep 6 keep 7 keep 8 keep 9 keep 10 keep 11 keep 12 keep 13 keep 14 keep 15 keep 16 keep 17 keep 18 keep 19 keep 20 keep 21