/ / ¿Cómo evitar las líneas de comentarios para el análisis durante el reemplazo de cadenas en un archivo? - expresión regular, perl

¿Cómo evitar las líneas de comentarios para analizar durante el reemplazo de cadenas en un archivo? - regex, perl

No puedo evitar las líneas de comentarios (líneas que comienzan con *) para analizar durante el reemplazo de cadenas en un archivo. Ayúdame con mi código.

`perl -pi.bak -e "$_ =~/[#.*]*/; /s/PATTERN/REPLACEMENT STRING/g" Test.txt`;

Estoy usando Perl en Eclipse, Windows XP.

Recibo el siguiente mensaje de error:

Number found where operator expected at -e line 6, near "*    LAST UPDATED 09/15"
(Might be a runaway multi-line // string starting on line 1)
(Missing operator before 15?)
Bareword found where operator expected at -e line 6, near "1994 AT"
(Missing operator before AT?)

Gracias de antemano, Perl novato

Respuestas

0 para la respuesta № 1

utilizar next para omitir el siguiente código si coincide con un comentario:

perl -i.back -p -e"next if /^#/; s/PATTERN/REPLACEMENT STRING/" Test.txt

actualizar: ahora, como sugirió choroba, en lugar de lanzar una instancia separada de Perl y tener que lidiar con comillas, probablemente debería tener todo en su código principal:

my $file= "Test.txt";
my $bak= "$file.bak";

rename $file, $bak or die "cannot rename $file into $bak: $!";;

open( my $in,  "<", $bak)  or die "cannot open $bak: $!";
open( my $out, ">", $file) or die "cannot create $file: $!";

while( <$in>)
{ if( ! /^*/) # note the backslash here, * is a meta character
{ s/PERFORM Q$func[5]E[.]*/# PERFORM $func[5].n $hash{$func[5]}/g; }
print {$out} $_;
}
close $in;
close $out;

Tenga en cuenta que $func[5] puede (potencialmente) incluir metacaracteres, así que usé Q y E para escapar de ellos.

No estoy seguro de la [.]* parte, que como está escrito coincide con un corchete, un punto y 0 o más corchetes de cierre: [., [.], o [.]]. Sospecho que eso no es lo que quieres.


2 para la respuesta № 2

Debe realizar el reemplazo solo si la cadena no coincide:

perl -pi.bak -e "s/PATTERN/REPLACEMENT STRING/g unless /^#/" Test.txt

Además, parece que está intentando llamar a Perl desde Perl. Eso suele ser más lento que procesar el archivo desde el interior de su programa original.


1 para la respuesta № 3

Utilizo esto para omitir las líneas que coinciden con la expresión regular

perl -ne "print unless /^*/" filename

0 para la respuesta № 4

Pruebe esto si intenta omitir las líneas que comienzan con "*" como comentarios:

perl -pi.bak -e "s/PATTERN/REPLACEMENT STRING/g unless /^*/" Test.txt

Al procesar un archivo como este:

* this is a comments: AAA => BBB
AAA
AAB
ABB
BBB

correr

perl -pi.bak -e "s/AAA/BBB/g unless /^*/" Test.txt

conseguirás

* this is a comments: AAA => BBB
BBB
AAB
ABB
BBB

Solo se reemplazará el AAA en el contexto normal.