[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 -
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
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:
- [Perl] Comparaison remplacement de lignes
- Remplacement coco - Accueil - Réseaux sociaux
- Coco.fr remplacement - Accueil - Réseaux sociaux
- Comparaison million milliard - Accueil - Technologies
- Partage de photos en ligne - Guide
- Afficher lignes masquées excel ✓ - Forum Excel
9 réponses
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
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
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
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
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.
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.
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
Et j'ai plusieurs lignes dans le fichier parm.txt pour remplacer plusieurs champs dans le fichier conf.config
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
<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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
L'exemple que j'ai donné été bon, il suffisait de l'adapter un peu.
Le script
parm.txt
config
Exécution et vérification des fichiers
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'-->
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
<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
Salut,
Le script
parm2.txt
config2
Exécution et vérification des fichiers
lami20j
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