in reply to Regex question
You can do that by buffering the last "B" lines.
my $B = 5; my $A = 3; my $re = qr/somepat/; my $skip = 0; my @lines; while (<>) { if (/$re/) { @lines = (); $skip = $A; } elsif ($skip) { --$skip; } else { push @lines, $_; print(shift(@lines)) if @lines > $B; } } print for @lines;
For test data, I used
keep 1 discard B5 discard B4 discard B3 discard B2 discard B1 somepat discard A1 discard A2 discard A3 keep 2 keep 3 discard B5 discard B4 discard B3 discard B2 discard B1 somepat discard A1 somepat discard A1 discard A2 discard A3 keep 4 discard B5 discard B4 discard B3 discard B2 discard B1 somepat discard A1 discard A2 discard A3 discard B1 somepat discard A1 discard A2 discard A3 keep 5
For output, you should get
keep 1 keep 2 keep 3 keep 4 keep 5
|
|---|