[Perl] Remplacement dans un fichier

Résolu/Fermé
KuKrApOk59 Messages postés 437 Date d'inscription jeudi 27 décembre 2007 Statut Membre Dernière intervention 13 septembre 2013 - Modifié par KuKrApOk59 le 8/04/2010 à 14:32
KuKrApOk59 Messages postés 437 Date d'inscription jeudi 27 décembre 2007 Statut Membre Dernière intervention 13 septembre 2013 - 15 avril 2010 à 16:03
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 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
9 avril 2010 à 14:17
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 jeudi 27 décembre 2007 Statut Membre Dernière intervention 13 septembre 2013 84
9 avril 2010 à 16:43
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 jeudi 27 décembre 2007 Statut Membre Dernière intervention 13 septembre 2013 84
15 avril 2010 à 13:22
Je viens d'essayer et ça fonctionne parfaitement !
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
Modifié par lami20j le 15/04/2010 à 14:05
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 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
15 avril 2010 à 14:13
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
15 avril 2010 à 15:22
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 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
15 avril 2010 à 15:29
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
15 avril 2010 à 15:36
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 jeudi 27 décembre 2007 Statut Membre Dernière intervention 13 septembre 2013 84
15 avril 2010 à 14:42
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
Modifié par lami20j le 15/04/2010 à 15:26
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 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
15 avril 2010 à 15:16
on boucle sur chaque ligne du fichier passé en paramètre ou du standard input
0
KuKrApOk59 Messages postés 437 Date d'inscription jeudi 27 décembre 2007 Statut Membre Dernière intervention 13 septembre 2013 84
15 avril 2010 à 16:03
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