[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
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
A voir également:
- [Perl] Comparaison remplacement de lignes
- Coco chat remplacement - Accueil - Réseaux sociaux
- Remplaçant de Coco : quelles solutions pour tchater gratuitement en ligne ? - Accueil - Réseaux sociaux
- Comparaison million milliard - Accueil - Technologies
- Partage de photos en ligne - Guide
- Site de vente en ligne particulier - Guide
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
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
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
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
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.
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
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
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.
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.
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
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
<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
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
8 déc. 2011 à 10:55
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'-->
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
13 déc. 2011 à 21:34
Salut,
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
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
<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
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
Modifié par lami20j le 13/12/2011 à 22:34
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
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
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 !
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 !
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
14 déc. 2011 à 13:52
Salut,
De rien.
Je suis content que tu soit content ;-)
Bonne journée à toi.
De rien.
Je suis content que tu soit content ;-)
Bonne journée à toi.