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 № 1utilizar 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.