teclado sintaxis sentencia programando por herencia funciones entrada ejemplos con perl

sintaxis - Búsqueda en varias líneas reemplazar con Perl



sentencia perl (3)

Sé que este tipo de preguntas ya se han hecho muchas veces antes. La razón por la que vuelvo aquí es porque siento que me he perdido algo simple y fundamental.

¿Es posible mejorar este tipo de rutina de búsqueda y reemplazo? Por ejemplo, sin abrir el mismo archivo dos veces. También consejos relacionados con la velocidad son bienvenidos.

Tenga en cuenta que esto funciona con coincidencias de líneas múltiples y reemplaza también cadenas de varias líneas.

#!/bin/perl -w -0777 local $/ = undef; open INFILE, $full_file_path or die "Could not open file. $!"; $string = <INFILE>; close INFILE; $string =~ s/START.*STOP/$replace_string/sm; open OUTFILE, ">", $full_file_path or die "Could not open file. $!"; print OUTFILE ($string); close OUTFILE;


Este tipo de búsqueda y reemplazo se puede lograr con un solo trazo, como:

perl -i -pe ''s/START.*STOP/replace_string/g'' file_to_change

Para obtener más formas de lograr lo mismo, revisa este thread . Para manejar búsquedas de líneas múltiples, use el siguiente comando:

perl -i -pe ''BEGIN{undef $/;} s/START.*STOP/replace_string/smg'' file_to_change

Para convertir el siguiente código de un programa de una sola línea a un programa perl, eche un vistazo a la documentación de perlrun .

Si realmente encuentra la necesidad de convertir esto en un programa de trabajo, simplemente deje que Perl maneje el archivo de apertura / cierre por usted.

#!/usr/bin/perl -pi #multi-line in place substitute - subs.pl use strict; use warnings; BEGIN {undef $/;} s/START.*STOP/replace_string/smg;

A continuación, puede invocar el script con el nombre de archivo como primer argumento

$perl subs.pl file_to_change

Si quieres una secuencia de comandos más sustanciosa donde puedas manejar las operaciones de abrir / cerrar archivo (no nos encantan todas esas sentencias ''morir''), eche un vistazo al ejemplo en perlrun bajo el modificador -i [extensión].


Extrayendo la breve respuesta de los comentarios, para cualquiera que busque una línea rápida, y la razón por la que Perl ignora sus opciones de RegEx desde la línea de comando.

perl -0pe ''s/search/replace/gms'' file

Sin el argumento -0 , Perl procesa datos line-by-line , lo que hace que las búsquedas de line-by-line múltiples fallen.


Teniendo en cuenta que sorbe todo el contenido del archivo con:

local $/ = undef; open INFILE, $full_file_path or die "Could not open file. $!"; $string = <INFILE>; close INFILE;

Y luego haga todo el procesamiento con $string , no hay conexión entre cómo maneja el archivo y cómo procesa los contenidos. Tendría un problema si abrió el archivo para escribir antes de terminar de leerlo, ya que al abrir un archivo para escritura crea un nuevo archivo, descartando los contenidos anteriores.

Si todo lo que intenta hacer es guardar en las declaraciones de abrir / cerrar, entonces haga lo que sugirió Jonathan Leffer . Si su pregunta es acerca de la búsqueda y el reemplazo de líneas múltiples, entonces aclare cuál es el problema.