[Perl] Comparaison remplacement de lignes

Fermé
waloo76 Messages postés 5 Date d'inscription mardi 8 novembre 2011 Statut Membre Dernière intervention 14 décembre 2011 - 8 nov. 2011 à 14:08
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 14 déc. 2011 à 13:52
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
Modifié par lami20j le 9/11/2011 à 22:15
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
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
22 nov. 2011 à 12:04
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
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
24 nov. 2011 à 06:40
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 mardi 8 novembre 2011 Statut Membre Dernière intervention 14 décembre 2011
8 déc. 2011 à 09:38
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
8 déc. 2011 à 10:55
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 mardi 8 novembre 2011 Statut Membre Dernière intervention 14 décembre 2011
13 déc. 2011 à 21:34
Salut,
0
Parfait c exactement ce que je voulais!
Merci vraiment pour ton aide
0
waloo76 Messages postés 5 Date d'inscription mardi 8 novembre 2011 Statut Membre Dernière intervention 14 décembre 2011
13 déc. 2011 à 21:40
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
Modifié par lami20j le 13/12/2011 à 22:34
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 mardi 8 novembre 2011 Statut Membre Dernière intervention 14 décembre 2011
14 déc. 2011 à 10:47
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
14 déc. 2011 à 13:52
Salut,

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