[Perl] Remplacement dans un fichier

Résolu
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]

7 réponses

  1. Contributeur
    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
    1. Salut,

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

      Je te remercie, et je vais essayer ça :D
      0
      1. Je viens d'essayer et ça fonctionne parfaitement !
        0
        1. Modérateur
          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
          1. Contributeur
            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
          2. Modérateur
            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
          3. Contributeur
            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
          4. Modérateur
            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
        2. 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
          1. Modérateur
            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
        3. Contributeur
          on boucle sur chaque ligne du fichier passé en paramètre ou du standard input
          0
          1. 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

            Discussions similaires

            question pix mot caché

            7 réponses