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;
}
}
Prueba esto
#!/usr/bin/perl -w
@files = <*>;
foreach $file (@files) {
print $file . ''/n'';
}
Echa un vistazo a glob en Perl:
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.