[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   -
Salutations

Quand je suis dans mon shell favori, j'effectue des remplacements via :

perl -pi -e 's/lib\/nagios/lib64\/nagios/g' /etc/nagios/nrpe.cfg
Je 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:

7 réponses

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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;
 
2
KuKrApOk59 Messages postés 437 Date d'inscription   Statut Membre Dernière intervention   84
 
Salut,

Effectivement, je n'avais pas pensé à faire comme cela

Je te remercie, et je vais essayer ça :D
0
KuKrApOk59 Messages postés 437 Date d'inscription   Statut Membre Dernière intervention   84
 
Je viens d'essayer et ça fonctionne parfaitement !
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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

~ $ 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
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
une question
est-ce qu'au milieu d'un code perl je peux avoir l'équivalent de l'option -i pour 1 fichier sans faire un open / close ?
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Normalemnet l'option -i est passé aux interpreteur dans ligne shebang
Maintenant en fonctionne de ce qu'on veux faire, il doit avoir plusieurs possibilités de le faire.
As-tu un cas précis, pour que je comprenne mieux? ;-)
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
c'était la question du post 1, comment éditer un seul fichier dans un code perl.
puisque je pense que si j'utilise l'option -i, elle va s'appliquer à tout les fichiers
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KuKrApOk59 Messages postés 437 Date d'inscription   Statut Membre Dernière intervention   84
 
Juste pour bien comprendre et apprendre (c'est bien aussi :))

Qu'est ce qui est implicitement passé ici :

while(<???>){
    s+lib/nagios+lib64/nagios+g; 
    print; 
} 


Merci d'éclairer ma lanterne !
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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 :

    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>.)
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
on boucle sur chaque ligne du fichier passé en paramètre ou du standard input
0
KuKrApOk59 Messages postés 437 Date d'inscription   Statut Membre Dernière intervention   84
 
C'est effectivement un peu plus clair pour <>
Il faut que je creuse le sujet, y'a de quoi faire d'après ce que je lis là dessus

Pour la passage de -i dans la ligne shebang, cela ne pose pas de souci (pour mon cas), il n'y a qu'un fichier à modifier

Merci à vous
0