Recherche multiligne remplacée par Perl

Je sais que ce genre de questions a déjà été posé plusieurs fois auparavant. La raison pour laquelle je reviens ici est que j’ai l’impression d’avoir manqué quelque chose de simple et de fondamental.

Est-il possible de rendre ce type de recherche plus efficace? Par exemple sans ouvrir le même fichier deux fois. Les conseils relatifs à la vitesse sont également les bienvenus.

Veuillez noter que cela fonctionne avec les correspondances multilignes et remplace également les chaînes multilignes.

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

Ce type de recherche et de remplacement peut être accompli avec une seule ligne comme –

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

Pour plus de moyens pour accomplir la même chose, consultez ce fil de discussion . Pour gérer les recherches sur plusieurs lignes, utilisez la commande suivante –

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

Afin de convertir le code suivant d’un programme à une ligne en un programme perl, consultez la documentation de perlrun .

Si vous trouvez vraiment le besoin de le convertir en un programme fonctionnel, laissez simplement Perl gérer le fichier qui s’ouvre / se ferme pour vous.

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

Vous pouvez ensuite appeler le script avec le nom de fichier comme premier argument

 $perl subs.pl file_to_change 

Si vous voulez un script plus volumineux où vous manipulez les opérations d’ouverture / fermeture de fichier (aimons-nous pas toutes ces instructions ‘die’) alors jetez un œil à l’exemple de perlrun sous le commutateur -i [extension].

Tirant la réponse courte des commentaires, pour ceux qui recherchent un one-liner rapide, et la raison pour laquelle Perl ignore leurs options RegEx à partir de la ligne de commande.

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

Sans l’argument -0 , Perl traite les données ligne par ligne , ce qui entraîne l’échec des recherches multilignes.

Considérant que vous réduisez tout le contenu du fichier avec:

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

Et ensuite, faites tout le traitement avec $ssortingng , il n’y a pas de lien entre le traitement du fichier et le traitement du contenu. Vous auriez un problème si vous ouvriez le fichier pour l’écriture avant de l’avoir lu, car l’ouverture d’un fichier pour l’écriture crée un nouveau fichier, en supprimant le contenu précédent.

Si tout ce que vous essayez de faire est d’enregistrer des déclarations ouvertes / fermées , alors faites comme Jonathan Leffer l’a suggéré . Si votre question concerne la recherche multiligne et son remplacement, veuillez clarifier le problème.