[Perl] Comparaison remplacement de lignes

waloo76 Messages postés 5 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,

Je souhaite ecrire en Perl un script qui va modifier un fichier de config à partir des bonnes valeurs contenues dans un fichier parametre.

J'ai donc un fichier parm.txt qui contient ce genre de ligne:

EnableSiteSearch# <add key="EnableSiteSearch" value="true"/>

Le but etant de rechercher dans le fichier de config la valeur EnableSiteSearch et de reecrire la ligne entiere avec <add key="EnableSiteSearch" value="true"/> dans le fichier de config.

my $ParmFile = "e:\\parm.txt";
my (@info, @File_Tmp);
my $ConfFile = "E:\\config.config";

open (FILE,"$ParmFile") || die "Erreur E/S:$!\n";
my @ParmFile = <FILE>;
chomp (@ParmFile);
close (FILE);

foreach my $line_PARAM (@ParmFile){
@info = split(/#/, $line_PARAM);
#
open(FILE, "$ConfFile") || die "Erreur E/S:$!\n";
my @ConfFile = <FILE>;
chomp (@ConfFile);
close(FILE);
open FILE,">> $ConfFile";
my @newconffile = <FILE>;

Mais je bloque sur la recherche de la ligne et la modification de cette meme ligne.

Pouvez vous m'aider?

Merci de votre aide

9 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Modification puisque j'ai mal compris.
    Voici un exemple, mais il faudrait mieux avoir tes fichiers pour mieux comprendre.
    Dans mon exemple c'est important que la clé cherchée soit unique pour la construction du hash

    Le fichier original est sauvegardé avec l'extension .orig

    lami20j@debian-acer:~$ cat parm.txt
    EnableSiteSearch# <add key="EnableSiteSearch" value="true"/> 
    lami20j@debian-acer:~$ cat config.config
    EnableSiteSearch 
    lami20j@debian-acer:~$ cat parm.pl
    #!/usr/bin/perl -i.orig 
    use strict;use warnings;
    my %h;
    
    @ARGV=("config.config");
    open F,"parm.txt" or die "E/S : $!\n";
    
    while(<F>){
      /^(EnableSiteSearch)\s*#\s*(.*)/ and $h{$1}=$2;
    }
    
    
    while(<>){
      s/(EnableSiteSearch)/$h{$1}/;
      print;
    }
    __END__
    
    lami20j@debian-acer:~$ perl parm.pl
    lami20j@debian-acer:~$ cat config.config
    <add key="EnableSiteSearch" value="true"/>  
    lami20j@debian-acer:~$ cat config.config.orig 
    EnableSiteSearch 


    lami20j
    0
  2. waloo76
     
    En fait L'idéal serait de lire un fichier parm.txt ligne par ligne et de remplacer le 1er champ par le 2e champ.
    J'ai fait ce script avec perl/sed mais ce n'est surement pas très propre:

    my $ParmFile = "E:\\parm.txt";

    open (FILE, $ParmFile);
    my @File_PARAM = <FILE>;
    chomp (@File_PARAM);
    close (FILE);

    my (@info, @File_Tmp);

    my $ConfFile = "E:\\conf.config";;
    open (FILE, $ConfFile);
    my @File_CONF = <FILE>;
    chomp (@File_CONF);
    close (FILE);

    foreach my $line_PARAM (@File_PARAM){
    @info = split(/#/, $line_PARAM);

    my $output = qx{ sed -i -e s/$info[0]/$info[1]/ $ConfFile };

    }

    contenu conf.config:

    <add key="value1" value="http://$Services:8080/test/test1"/>
    <add key="value2" value="http://$Services:8080/test/test2"/>
    <add key="value3" value="http://$Services:8080/test/test3"/>
    <add key="value4" value="http://$Services:8080/test/test4"/>

    contenu parm.txt:

    $ServicesHUB#1.2.3.4

    Le truc étrange, c'est que le sed me cree 1 fichier pour chaque ligne de fichier de conf.

    Merci de ton aide
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Utiliser sed quand on fait de perl ce n'est pas génial ni nécessaire.

    Je vois que tu as donné le contenu de tes fichiers.
    Je pense que c'est plutôt un exemple.
    Peux-tu donner les vrai fichiers.

    Et aussi montrer ce que tu veux obtenir comme résultat, puisqu'à vrai dire je ne comprends pas exactement ce que tu veux.

    0
  4. waloo76
     
    Mon bon est de remplacer la variable $Services dans conf.config par 1.2.3.4 contenu dans parm.txt.

    Et j'ai plusieurs lignes dans le fichier parm.txt pour remplacer plusieurs champs dans le fichier conf.config
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      Je n'ai pas compris.
      Ce que j'ai besoin c'est d'afficher un exemple concret de ce que tu veux obtenir comme résultat avec les 2 fichiers que tu utilises.
      Si tu pourrais donner tes fichiers ça serait encore mieux.
      0
    2. waloo76 Messages postés 5 Statut Membre
       
      Voilà le (une partie) fichier config à modifier:

      <add key="SiteHostName" value="$[SiteHostName]"/>

      <!-- mail settings -->
      <add key="MailEnabled" value="true"/>
      <add key="EmailSender" value="$[EmailSender]"/>
      <add key="EmailSenderDisplayName" value="Walooo"/>
      <add key="DebugDropFolder" value="C:\temp\"/>
      <add key="MediaServerHostName" value="$[MediaServerHostName]"/>

      <!-- simulator settings -->
      <add key="SimulatorAvailable" value="true"/>

      <!-- service proxy exception settings -->
      <add key="FaultHandlerEmailSender" value="$[EmailSender]"/>
      <add key="FaultHandlerEmailRecipients" value="$[EmailRecipients]"/>
      <add key="FaultHandlerEmailSubject" value="Service Proxy Exception"/>

      <!-- Web Proxy settings -->
      <add key="WebProxyAddress" value="http://$[WebProxyAddress]:8080"/>
      <add key="WebProxyUsername" value="$[WebProxyUsername]"/>
      <add key="WebProxyPassword" value="$[WebProxyPassword]"/>
      <add key="WebProxyDomain" value="$[WebProxyDomain]"/>
      <add key="WebProxyAuthType" value="NTLM"/> <!-- 'Kerberos', 'Basic', 'Digest', 'Negotiate', 'NTLM'-->


      Voilà le contenu du fichier parm.txt:

      $[SiteHostName]#www.google.fr
      $[EmailSender]#walooo@google.fr
      $[MediaServerHostName]#int.google.fr
      $[EmailRecipients]#walooo@gmail.com
      $[WebProxyAddress]#192.168.0.1
      $[WebProxyUsername]#walooo
      $[WebProxyPassword]#toto
      $[WebProxyDomain]#MAISON

      Le but étant de lire le fichier parm.txt et de remplacer les valeurs $[xxx] dans le fichier config par les valeurs suivant le # dans le fichier parm.txt

      Peux tu me venir en aide ?

      Merci
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    L'exemple que j'ai donné été bon, il suffisait de l'adapter un peu.

    Le script
    lami20j@debian-acer:~/perl$ cat parm.pl 
    #!/usr/bin/perl -i.orig 
    use strict;use warnings;
    my %h;
    
    @ARGV=("config");
    open F,"parm.txt" or die "E/S : $!\n";
    
    while(<F>){
      /^(\$.*)#(.*)/ and $h{$1}=$2;
    }
    
    while(<>){
      s/(.*=.*)(\$\[[^\"]*])(.*)/$1$h{$2}$3/;
      print;
    }
    __END__

    parm.txt
    lami20j@debian-acer:~/perl$ cat parm.txt 
    $[SiteHostName]#www.google.fr
    $[EmailSender]#walooo@google.fr
    $[MediaServerHostName]#int.google.fr
    $[EmailRecipients]#walooo@gmail.com
    $[WebProxyAddress]#192.168.0.1
    $[WebProxyUsername]#walooo
    $[WebProxyPassword]#toto
    $[WebProxyDomain]#MAISON

    config
    lami20j@debian-acer:~/perl$ cat config 
    
    <add key="SiteHostName" value="$[SiteHostName]"/>
    
    <!-- mail settings -->
    <add key="MailEnabled" value="true"/>
    <add key="EmailSender" value="$[EmailSender]"/>
    <add key="EmailSenderDisplayName" value="Walooo"/>
    <add key="DebugDropFolder" value="C:\temp\"/>
    <add key="MediaServerHostName" value="$[MediaServerHostName]"/>
    
    <!-- simulator settings -->
    <add key="SimulatorAvailable" value="true"/>
    
    <!-- service proxy exception settings -->
    <add key="FaultHandlerEmailSender" value="$[EmailSender]"/>
    <add key="FaultHandlerEmailRecipients" value="$[EmailRecipients]"/>
    <add key="FaultHandlerEmailSubject" value="Service Proxy Exception"/>
    
    <!-- Web Proxy settings -->
    <add key="WebProxyAddress" value="http://$[WebProxyAddress]:8080"/>
    <add key="WebProxyUsername" value="$[WebProxyUsername]"/>
    <add key="WebProxyPassword" value="$[WebProxyPassword]"/>
    <add key="WebProxyDomain" value="$[WebProxyDomain]"/>
    <add key="WebProxyAuthType" value="NTLM"/> <!-- 'Kerberos', 'Basic', 'Digest', 'Negotiate', 'NTLM'--> 


    Exécution et vérification des fichiers
    lami20j@debian-acer:~/perl$ perl parm.pl 
    lami20j@debian-acer:~/perl$ cat config
    
    <add key="SiteHostName" value="www.google.fr"/>
    
    <!-- mail settings -->
    <add key="MailEnabled" value="true"/>
    <add key="EmailSender" value="walooo@google.fr"/>
    <add key="EmailSenderDisplayName" value="Walooo"/>
    <add key="DebugDropFolder" value="C:\temp\"/>
    <add key="MediaServerHostName" value="int.google.fr"/>
    
    <!-- simulator settings -->
    <add key="SimulatorAvailable" value="true"/>
    
    <!-- service proxy exception settings -->
    <add key="FaultHandlerEmailSender" value="walooo@google.fr"/>
    <add key="FaultHandlerEmailRecipients" value="walooo@gmail.com"/>
    <add key="FaultHandlerEmailSubject" value="Service Proxy Exception"/>
    
    <!-- Web Proxy settings -->
    <add key="WebProxyAddress" value="http://192.168.0.1:8080"/>
    <add key="WebProxyUsername" value="walooo"/>
    <add key="WebProxyPassword" value="toto"/>
    <add key="WebProxyDomain" value="MAISON"/>
    <add key="WebProxyAuthType" value="NTLM"/> <!-- 'Kerberos', 'Basic', 'Digest', 'Negotiate', 'NTLM'--> 
    lami20j@debian-acer:~/perl$ cat config.orig
    
    <add key="SiteHostName" value="$[SiteHostName]"/>
    
    <!-- mail settings -->
    <add key="MailEnabled" value="true"/>
    <add key="EmailSender" value="$[EmailSender]"/>
    <add key="EmailSenderDisplayName" value="Walooo"/>
    <add key="DebugDropFolder" value="C:\temp\"/>
    <add key="MediaServerHostName" value="$[MediaServerHostName]"/>
    
    <!-- simulator settings -->
    <add key="SimulatorAvailable" value="true"/>
    
    <!-- service proxy exception settings -->
    <add key="FaultHandlerEmailSender" value="$[EmailSender]"/>
    <add key="FaultHandlerEmailRecipients" value="$[EmailRecipients]"/>
    <add key="FaultHandlerEmailSubject" value="Service Proxy Exception"/>
    
    <!-- Web Proxy settings -->
    <add key="WebProxyAddress" value="http://$[WebProxyAddress]:8080"/>
    <add key="WebProxyUsername" value="$[WebProxyUsername]"/>
    <add key="WebProxyPassword" value="$[WebProxyPassword]"/>
    <add key="WebProxyDomain" value="$[WebProxyDomain]"/>
    <add key="WebProxyAuthType" value="NTLM"/> <!-- 'Kerberos', 'Basic', 'Digest', 'Negotiate', 'NTLM'--> 


    0
    1. waloo76 Messages postés 5 Statut Membre
       
      Salut,
      0
  7. waloo76
     
    Parfait c exactement ce que je voulais!
    Merci vraiment pour ton aide
    0
  8. waloo76 Messages postés 5 Statut Membre
     
    Salut, j'ai un deuxieme fichier à modifier de la meme maniere mais il ne se presente pas tout à fait pareil, j'ai dejà placé mes "variables":

    <add name="db1" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db1" />
    <add name="db2" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db2" />
    <add name="db3" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db3" />
    <add name="db4" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db4" />
    <add name="db5" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db5s" />
    <add name="db6t" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db6" />

    et voilà le 2e fichier de param:

    $[user_id]#walooo
    $[password]#toto
    $[server]#server1
    $[port]#1234
    $[instance]#inst1

    J'ai voulu faire modifier le fichier de conf avec ton script mais seul la variable $[instance] a été modifié. Je pense que celà est du au fait que plusieurs valeurs sont à remplacer sur une meme ligne.
    Pourrais tu m'aider encore une fois ?

    Merci par avance
    0
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Le script
    :~/perl$ cat parm2.pl  
    #!/usr/bin/perl -i.orig 
    use strict;use warnings; 
    my %h; 
    
    @ARGV=("config2"); 
    open F,"parm2.txt" or die "E/S : $!\n"; 
    
    while(<F>){ 
      /^(\$.*)#(.*)/ and $h{$1}=$2; 
    } 
    
    while(<>){ 
      s/(\$\[[^\]]*\])/$h{$1}/g; 
      print; 
    } 
    __END__ 
    

    parm2.txt
    :~/perl$ cat parm2.txt  
    $[user_id]#walooo 
    $[password]#toto 
    $[server]#server1 
    $[port]#1234 
    $[instance]#inst1

    config2
    :~/perl$ cat config2 
    
    <add name="db1" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db1" /> 
    <add name="db2" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db2" /> 
    <add name="db3" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db3" /> 
    <add name="db4" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db4" /> 
    <add name="db5" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db5s" /> 
    <add name="db6t" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db6" />  
    

    Exécution et vérification des fichiers
    :~/perl$ perl parm2.pl  
    :~/perl$ cat config2 
    
    <add name="db1" connectionString="user id=walooo;password=toto;Data Source=server1,1234\inst1;Database=db1" /> 
    <add name="db2" connectionString="user id=walooo;password=toto;Data Source=server1,1234\inst1;Database=db2" /> 
    <add name="db3" connectionString="user id=walooo;password=toto;Data Source=server1,1234\inst1;Database=db3" /> 
    <add name="db4" connectionString="user id=walooo;password=toto;Data Source=server1,1234\inst1;Database=db4" /> 
    <add name="db5" connectionString="user id=walooo;password=toto;Data Source=server1,1234\inst1;Database=db5s" /> 
    <add name="db6t" connectionString="user id=walooo;password=toto;Data Source=server1,1234\inst1;Database=db6" />  
    :~/perl$ cat config2.orig  
    
    <add name="db1" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db1" /> 
    <add name="db2" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db2" /> 
    <add name="db3" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db3" /> 
    <add name="db4" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db4" /> 
    <add name="db5" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db5s" /> 
    <add name="db6t" connectionString="user id=$[user_id];password=$[password];Data Source=$[server],$[port]\$[instance];Database=db6" />


    lami20j
    0
  10. waloo76 Messages postés 5 Statut Membre
     
    Super merci lami20j, ton script marche sur les 2 types de fichiers.

    Tu m'as donné un vrai coup de main, merci car j'avoue n'être pas aussi à l'aise que toi avec le perl ;-)

    Bonne journée !
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      De rien.
      Je suis content que tu soit content ;-)
      Bonne journée à toi.
      0