ventajas que español desventajas caracteristicas perl replace bulk

perl - que - mongodb español



¿Cómo puedo hacer una búsqueda masiva y reemplazar con Perl? (5)

Tengo el siguiente script que toma un archivo de entrada, un archivo de salida y reemplaza la cadena en el archivo de entrada con alguna otra cadena y escribe el archivo de salida.

Quiero cambiar la secuencia de comandos para recorrer un directorio de archivos, es decir, en lugar de solicitar archivos de entrada y salida, la secuencia de comandos debe tomar como argumento una ruta de directorio como C: / temp / allFilesTobeReplaced / y buscar una cadena x y reemplazarla con y para todos los archivos debajo de esa ruta de directorio y escriba los mismos archivos.

¿Cómo hago esto?

Gracias.

$file=$ARGV[0]; open(INFO,$file); @lines=<INFO>; print @lines; open(INFO,">c:/filelist.txt"); foreach $file (@lines){ #print "$file/n"; print INFO "$file"; } #print "Input file name: "; #chomp($infilename = <STDIN>); if ($ARGV[0]){ $file= $ARGV[0] } print "Output file name: "; chomp($outfilename = <STDIN>); print "Search string: "; chomp($search = <STDIN>); print "Replacement string: "; chomp($replace = <STDIN>); open(INFO,$file); @lines=<INFO>; open(OUT,">$outfilename") || die "cannot create $outfilename: $!"; foreach $file (@lines){ # read a line from file IN into $_ s/$search/$replace/g; # change the lines print OUT $_; # print that line to file OUT } close(IN); close(OUT);


El uso del revestimiento individual perl

perl -pi -e ''s/original string/new string/'' filename

se puede combinar con File::Find , para dar la siguiente secuencia de comandos individual (esta es una plantilla que uso para muchas de estas operaciones).

use File::Find; # search for files down a directory hierarchy (''.'' taken for this example) find(/&wanted, "."); sub wanted { if (-f $_) { # for the files we are interested in call edit_file(). edit_file($_); } } sub edit_file { my ($filename) = @_; # you can re-create the one-liner above by localizing @ARGV as the list of # files the <> will process, and localizing $^I as the name of the backup file. local (@ARGV) = ($filename); local($^I) = ''.bak''; while (<>) { s/original string/new string/g; } continue { print; } }



Puedes hacer esto con el -i param:

Simplemente procesa todos los archivos como siempre, pero incluye -i.bak:

#!/usr/bin/perl -i.bak while ( <> ) { s/before/after/; print; }

Esto debería procesar cada archivo y cambiar el nombre del original a original.bak Y, por supuesto, puedes hacerlo como una línea como lo menciona @Jamie Cook


Sé que puede usar un simple Perl one-liner desde la línea de comandos, donde nombre de archivo puede ser un nombre de archivo único o una lista de nombres de archivos. Probablemente puedas combinar esto con la respuesta de bgy para obtener el efecto deseado:

perl -pi -e ''s/original string/new string/'' filename

Y sé que es trivial, pero esto se parece mucho a sed, si puedes usar herramientas gnu:

for i in `find ./allFilesTobeReplaced`; do sed -i s/original string/new string/g $i; done


perl -pi -e # OLD # NUEVO # g ''nombre de archivo. Puede reemplazar el nombre de archivo con el patrón que se adapte a su lista de archivos.