2011-08-09 13 views
34

Quiero reemplazar la palabra "azul" por "roja" en todos los archivos de texto nombrados como 1_classification.dat, 2_classification.dat y más. Quiero editar el mismo archivo, así que probé este código pero no funciona. ¿Dónde estoy equivocado?¿Cómo reemplazar una cadena en un archivo existente en Perl?

@files=glob("*_classification.dat"); 
foreach my $file (@files) 
{ 
    open(IN,$file) or die $!; 
    <IN>; 
    while(<IN>) 
    { 
     $_='~s/blue/red/g'; 
     print IN $file; 
    } 

    close(IN) 
} 

Respuesta

92

¿Algo malo con un trazador de líneas?

$ perl -pi.bak -e 's/blue/red/g' *_classification.dat 

Explicación

  • -p procesos, a continuación, imprime <> línea por línea
  • -i activa la edición in situ. Los archivos se copia de seguridad mediante la .bak extensión
  • la sustitución de expresiones regulares actúa sobre la variable implícita, que son los contenidos del archivo, línea por línea
+6

Las comillas dobles si el comando se ejecuta en Windows – Zaid

+0

Sí, o sin comillas en absoluto, si el código no contenga espacios. – bart

+4

El uso de '' 'globbing en argumentos no parece funcionar en Windows. – TLP

10

$_='~s/blue/red/g';

Uh, ¿¿qué??

Sólo

s/blue/red/g; 

o, si usted insiste en el uso de una variable (lo cual no es necesario cuando se usa $ _, pero sólo quiere mostrar la sintaxis correcta):

$_ =~ s/blue/red/g; 
2

Ninguno de las respuestas existentes aquí proporcionó un ejemplo completo de cómo hacer esto desde dentro de un script (no de una sola línea). Esto es lo que hice:

rename($file, $file.'.bak'); 
open(IN, '<'.$file.'.bak') or die $!; 
open(OUT, '>'.$file) or die $!; 
while(<IN>) 
{ 
    $_ =~ s/blue/red/g; 
    print OUT $_; 
} 
close(IN); 
close(OUT); 
Cuestiones relacionadas