Provavelmente, uma maneira melhor de escrever isso logicamente, mas acho que isso pode ser feito:
#!/usr/bin/perl
use strict;
use warnings;
my $previous_line = '';
while(<>) {
if ( /pattern/ ) {
if ( (! ($previous_line =~ /^#/)) && (! ($previous_line =~ /pattern/))) {
print $previous_line;
}
} elsif (! ($previous_line =~ /pattern/)) {
print $previous_line;
}
$previous_line = $_;
}
print $previous_line if not ($previous_line =~ /pattern/);
Basicamente, o loop é uma linha atrás da linha anterior. Ele diz que não há problema em imprimir a linha anterior se:
- Se a linha atual corresponder ao padrão: OK para imprimir anterior, desde que o anterior também não corresponda ao padrão ou seja um comentário.
- Se esta linha não for padrão, é ok para imprimir a linha anterior como desde que não correspondesse ao padrão.
Você pode salvar o código em um arquivo e usá-lo como: perl thefile.pl textfile_you_want_to_filter