remplacer un ligne dans un fichier

remplacer un ligne dans un fichier - Perl - Programmation

Marsh Posté le 23-05-2007 à 10:55:01    

Bonjour,
 
J'ai un fichier qui contient cette ligne et d'autre lignes:
 

Citation :


...
$stand=yes
...


 
je souhaiterais pouvoir modifier uniquement cette ligne,
en faite je veux faire un script qui prenne en parametre une variable avec sa valeur ( ex: $stand=no), et ce script doit m'ouvrir le fichier dont je parle audessus et modifier la ligne la ligne ave la nouvelle valeur;
c'est a dire au depart j'ai
$stand=yes dans le fichier
et quand je lance mon script
j'ai cela dans le fichier $stand=no;
 
 
Merci à tous

Reply

Marsh Posté le 23-05-2007 à 10:55:01   

Reply

Marsh Posté le 23-05-2007 à 11:05:16    

et t'en es ou pour l'instant?
Nan parce que grosso modo ton truc se resume à ouvrir le fichier, faire une regex, ré-écrire la ligne.

Reply

Marsh Posté le 23-05-2007 à 11:12:27    

j'ouvre le fichier,
je trouve la ligne.
mais le truc c'est que je vois pas trop comment modifier ou supprimer la ligne et mettre ma nouvelle valeur;
 

Reply

Marsh Posté le 23-05-2007 à 11:18:28    

Reply

Marsh Posté le 23-05-2007 à 11:31:05    

donny3 a écrit :

j'ouvre le fichier,
je trouve la ligne.
mais le truc c'est que je vois pas trop comment modifier ou supprimer la ligne et mettre ma nouvelle valeur;


 
A moins que ton fichier soit vraiment gros, le plus simple serait d'en copier tout le contenu dans un nouveau fichier avec, au passage, la nouvelle valeur de ta variable. Ensuite, tu n'as plus qu'à renommer bêtement le nouveau fichier pour écraser l'ancien et voilà.
 
Autre solution, rajouter ta ligne à la fin du fichier existant. Arrange toi dans ce cas pour que ton script n'arrête pas de lire le fichier actuel dès qu'il trouve la variable qui l'intéresse parce qu'avec cette méthode, il doit la trouver 2 fois : 1 fois quelque part dans le fichier et 1 autre fois tout à la fin de celui-ci.
 
Mais ma 1ère solution me semble plus propre.

Reply

Marsh Posté le 23-05-2007 à 11:47:20    

euh, s'il n'y a que "stand=machin" à changer, on peut aussi utiliser l'option -i de l'interpréteur ;)


Message édité par Elmoricq le 23-05-2007 à 11:47:49
Reply

Marsh Posté le 23-05-2007 à 12:01:50    

en faite ce que j'ai fait c'est quelquechose dans ce genre
$stand est un peu plus compliquer il contient cela

Code :
  1. $y = '$stand= px(100 1001 200 2001);';
  2. $y =~ /^($stand= px\()(.*)(\);)$/;
  3. $y =~ s/$2/$newvalue/;


 
j'ai tester en mettant ma variable dans $y et sa fonctionne mais le truc que je ne vois pas, c'est comment faire cela pour que la modif se repercute dans mon fichier;
j'ouvre mon fichier ok, et apres, si je veux faire une modif dedans ??
la je suis un peu perdu

Reply

Marsh Posté le 23-05-2007 à 12:05:04    

Comme le dit Aricoh, il faut écrire un nouveau fichier, et écraser ensuite l'ancien avec.

Reply

Marsh Posté le 23-05-2007 à 13:09:31    

ok, je voulais faire sa des le debut, mais je pensai qu'il y avait un moyen de le faire sans reecrire le fichier mais apparamment non ou alors faut faire une usine à gaz.
ce que je vais faire, c'est ouvrir d'abord mon fichier, lire chaque ligne et la mettre dans un tableau et quand je tombe sur la ligne avec $stand ,je la remplace avec sa nouvelle valeur;
une fois mon tableau fait , je recreer un fichier avec les valeur contenu dans mon tableau et voila;
 
merci

Reply

Marsh Posté le 23-05-2007 à 13:11:55    

donny3 a écrit :

ok, je voulais faire sa des le debut, mais je pensai qu'il y avait un moyen de le faire sans reecrire le fichier mais apparamment non ou alors faut faire une usine à gaz.
ce que je vais faire, c'est ouvrir d'abord mon fichier, lire chaque ligne et la mettre dans un tableau et quand je tombe sur la ligne avec $stand ,je la remplace avec sa nouvelle valeur;
une fois mon tableau fait , je recreer un fichier avec les valeur contenu dans mon tableau et voila;
 
merci


 
C'est la solution la plus simple  :jap:  

Reply

Marsh Posté le 23-05-2007 à 13:11:55   

Reply

Marsh Posté le 05-07-2007 à 10:12:45    

Il faudrait faire qqch du style
 
perl -p 's/(\$stand=)yes/$1=no/' [nom_fichier] > [nom_fichier_modifié]
 
Mais sed est aussi efficace pour ce genre d'opération...
 
Cordialement

Reply

Marsh Posté le 06-07-2007 à 08:52:18    

perl -i permet de modifier directement le fichier que tu lis.

Reply

Marsh Posté le 06-07-2007 à 09:06:09    

hé les kidz, les "ups" deux mois plus tard c'est peut-être plus la peine ;)

Reply

Marsh Posté le 06-07-2007 à 10:39:30    

dreameddeath a écrit :

Mais sed est aussi efficace pour ce genre d'opération...


 
k, lol [:el g]
 
Chez Solaris en tout cas, traiter un fichier de 300Mo+ prends 10min en sed, 10s en PERL.

Reply

Marsh Posté le 28-11-2011 à 13:38:26    

Peut on également cibler des lignes dans un fichier et modifier la valeur qu'on y retrouve à 2.  
 
Par exemple, remplacer aux lignes, 50, 90, 130, 175, 215, 300, 615, "width = 215" par "width = 200".  
 
Variante, mettre toutes les variables width à 215, (même s'ils elles ne sont pas toutes à la même valeur).

Reply

Marsh Posté le 28-11-2011 à 17:04:04    

Il suffit de mettre un compteur de ligne et de ne permettre les opérations de remplacement qu'aux lignes ayant le numéro voulu.
Pour la seconde question, avec une expression régulière style
 s/width\s*=\s*\d+/width = 215/o;
ça devrait coller, non?
A+,


Message édité par gilou le 28-11-2011 à 17:04:20

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed