[Perl] Remplacement dans un fichier
Résolu
KuKrApOk59
Messages postés
437
Date d'inscription
Statut
Membre
Dernière intervention
-
KuKrApOk59 Messages postés 437 Date d'inscription Statut Membre Dernière intervention -
KuKrApOk59 Messages postés 437 Date d'inscription Statut Membre Dernière intervention -
Salutations
Quand je suis dans mon shell favori, j'effectue des remplacements via :
Et je trouverai ça stupide d'utiliser un
Si vous avez votre réponse, pensez à spécifier : [Résolu]
Quand je suis dans mon shell favori, j'effectue des remplacements via :
perl -pi -e 's/lib\/nagios/lib64\/nagios/g' /etc/nagios/nrpe.cfgJe voudrais pouvoir réutiliser ce remplacement dans un fichier, mais à utiliser dans un script Perl, pas en oneline à exécuter
Et je trouverai ça stupide d'utiliser un
system ( "perl -pi -e 's/lib\/nagios/lib64\/nagios/g' /etc/nagios/nrpe.cfg ")Comment puis-je faire, des idées ?
Si vous avez votre réponse, pensez à spécifier : [Résolu]
A voir également:
- [Perl] Remplacement dans un fichier
- Fichier bin - Guide
- Remplacement coco - Accueil - Réseaux sociaux
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Coco.fr remplacement - Accueil - Réseaux sociaux
7 réponses
hello
$file = "/etc/nagios/nrpe.cfg"; open (FILE, "<$file"); @lines = <FILE>; close FILE; open (STDOUT, ">$file"); for ( @lines ) { s+lib/nagios+lib64/nagios+g; print; } close STDOUT;
Salut,
Effectivement, je n'avais pas pensé à faire comme cela
Je te remercie, et je vais essayer ça :D
Effectivement, je n'avais pas pensé à faire comme cela
Je te remercie, et je vais essayer ça :D
Salut,
Tu peux aussi utiliser -i dans on script et modifier sur place, aussi faire une sauvegarde de l'original au cas où
Voici un exemple
GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
Tu peux aussi utiliser -i dans on script et modifier sur place, aussi faire une sauvegarde de l'original au cas où
Voici un exemple
~ $ cat fic lib/nagios ~ $ cat fic.pl #!/usr/bin/perl -i.orig use strict;use warnings; my $file = "fic"; @ARGV=($file); while(<>){ s+lib/nagios+lib64/nagios+g; print; } __END__ ~ $ perl fic.pl ~ $ cat fic lib64/nagios ~ $ cat fic.orig lib/nagios
GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
elle va s'appliquer à tout les fichiers
S'il s'agit de plusieurs fichiers, oui la modification sera faite à tous les fichiers.
Toutefois, on peut contrôler ça et faire un next dans la boucle pour sauter le fichier où on ne veux pas faire les modifications si jamais la chaine existe.
En même temps si la chaîne n'existe pas alors rien ne sera modifier.
S'il s'agit de plusieurs fichiers, oui la modification sera faite à tous les fichiers.
Toutefois, on peut contrôler ça et faire un next dans la boucle pour sauter le fichier où on ne veux pas faire les modifications si jamais la chaine existe.
En même temps si la chaîne n'existe pas alors rien ne sera modifier.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Juste pour bien comprendre et apprendre (c'est bien aussi :))
Qu'est ce qui est implicitement passé ici :
Merci d'éclairer ma lanterne !
Qu'est ce qui est implicitement passé ici :
while(<???>){ s+lib/nagios+lib64/nagios+g; print; }
Merci d'éclairer ma lanterne !
Re,
Pour mieux comprendre (source Opérateurs d'E/S )
Le filehandle vide <> est spécial et peut être utiliser pour émuler le comportement de sed et de awk. L'entrée de <> provient soit de l'entrée standard soit de tous les fichiers listés sur la ligne de commande. Voici comment ça marche : la première fois que <> est évalué, on teste le tableau @ARGV et s'il est vide alors $ARGV[0] est positionné à ''-'' qui lorsqu'il sera ouvert lira l'entrée standard. Puis le tableau @ARGV est traité comme une liste de nom de fichiers. La boucle :
while (<>) {
... # code pour chaque ligne
}
est équivalent au pseudo-code Perl suivant :
sauf qu'il est moins volumineux et qu'il marche réellement. Il décale vraiment le tableau @ARGV et stocke le nom du fichier courant dans la variable $ARGV. Il utilise aussi en interne le filehandle ARGV -- <> est simplement un synonyme de <ARGV> qui est magique. (Le pseudo-code précédent ne fonctionne pas car il tient pas compte de l'aspect magique de <ARGV>.)
Pour mieux comprendre (source Opérateurs d'E/S )
Le filehandle vide <> est spécial et peut être utiliser pour émuler le comportement de sed et de awk. L'entrée de <> provient soit de l'entrée standard soit de tous les fichiers listés sur la ligne de commande. Voici comment ça marche : la première fois que <> est évalué, on teste le tableau @ARGV et s'il est vide alors $ARGV[0] est positionné à ''-'' qui lorsqu'il sera ouvert lira l'entrée standard. Puis le tableau @ARGV est traité comme une liste de nom de fichiers. La boucle :
while (<>) {
... # code pour chaque ligne
}
est équivalent au pseudo-code Perl suivant :
unshift(@ARGV, '-') unless @ARGV; while ($ARGV = shift) { open(ARGV, $ARGV); while (<ARGV>) { ... # code pour chaque ligne } }
sauf qu'il est moins volumineux et qu'il marche réellement. Il décale vraiment le tableau @ARGV et stocke le nom du fichier courant dans la variable $ARGV. Il utilise aussi en interne le filehandle ARGV -- <> est simplement un synonyme de <ARGV> qui est magique. (Le pseudo-code précédent ne fonctionne pas car il tient pas compte de l'aspect magique de <ARGV>.)