my $prev = '';
my $skip_next = 0;
while (<>) {
if (/XXXXX/) {
$prev = '';
$skip_next = 1;
}
elsif ($skip_next) {
--$skip_next;
}
else {
print($prev);
$prev = $_;
}
}
print($prev);
If you want to skip more than one line:
my $skip_before = 1;
my $skip_after = 1;
my @prev;
my $skip_next = 0;
while (<>) {
if (/XXXXX/) {
@prev = ();
$skip_next = $skip_after;
}
elsif ($skip_next) {
--$skip_next;
}
else {
push @prev, $_;
print(shift(@prev)) if @prev > $skip_before;
}
}
print(@prev);
One read. One check. Handles subsequent matching lines. Handles matches on the first line. Handles matches on the last line.