[Perl] Comparaison remplacement de lignes

waloo76 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
lami20j Messages postés 21331 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
A voir également:

9 réponses

lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
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
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
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
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
waloo76 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
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

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

Posez votre question
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
waloo76 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Salut,
0
waloo76
 
Parfait c exactement ce que je voulais!
Merci vraiment pour ton aide
0
waloo76 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
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
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
waloo76 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
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
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

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