[Résolu] Substitution ?

Substitution ? [Résolu] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 14-12-2006 à 14:22:31    

Dans un fichier de configuration, j'aimerais remplacer par "salut" les valeurs de toutes les lignes commençant par "abc". Exemple :

chose=x
abc truc=y
abc bidule=z

doit devenir :

chose=x
abc truc=salut
abc bidule=salut

J'ai essayé ceci :

ed fichier  <<- EOF
    /abc
    s/=.*/=salut
    wq
EOF

mais ça ne remplace que la première ligne trouvée. Comment faire pour que ça agisse dans tout le fichier ?


Message édité par e-miel le 14-12-2006 à 16:09:03
Reply

Marsh Posté le 14-12-2006 à 14:22:31   

Reply

Marsh Posté le 14-12-2006 à 14:24:15    

pour le remplacement il faut mettre une option "g" quelque part. Sous ed je ne sais pas trop où par contre


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 14-12-2006 à 14:30:45    

Sans le "g", ça ne remplace que la première occurence dans une ligne, avec le "g" ça remplace dans la ligne complète... autrement dit, dans le cas présent, ça ne change rien.

Reply

Marsh Posté le 14-12-2006 à 14:38:44    

tu as essayé ? :gratgrat:


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 14-12-2006 à 14:43:11    

ed est obligatoire ou tu peux utiliser sed ?


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 14-12-2006 à 14:43:36    

Ceci ?

ed fichier  <<- EOF  
    /abc  
    s/=.*/=salut/g
    wq  
EOF

Evidemment !

Reply

Marsh Posté le 14-12-2006 à 14:45:35    

ou alors tu le fais en perl carrément ... [:jar jar]

 

perl -pi.bak -e 's/abc (\w+)=(\w+)/abc $1=salut/g;' fichier


Message édité par wedgeant le 14-12-2006 à 14:48:44

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 14-12-2006 à 14:45:54    

J'avais d'abord pensé à sed, mais je ne sais pas comment faire pour que le fichier de départ soit le même que le fichier d'arrivée avec sed, c'est pourquoi je me suis rabattu sur ed, son ancêtre. Tu sais comment faire ?

Reply

Marsh Posté le 14-12-2006 à 14:51:48    

e-miel a écrit :

J'avais d'abord pensé à sed, mais je ne sais pas comment faire pour que le fichier de départ soit le même que le fichier d'arrivée avec sed, c'est pourquoi je me suis rabattu sur ed, son ancêtre. Tu sais comment faire ?


Quand je fais ce genre de trucs, en général j'utilise sed ou perl et je passe par un fichier temporaire:
 
mv fichier fichier.tmp
sed -e '...' < fichier.tmp > fichier
rm fichier.tmp

 
EDIT: je viens de voir que perl -i, comme montré par WedgeAnt deux posts au dessus, permet de faire ça directement en place

Message cité 1 fois
Message édité par franceso le 14-12-2006 à 14:58:29

---------------
TriScale innov
Reply

Marsh Posté le 14-12-2006 à 15:13:10    

Je vais essayer perl (pour m'instruire) :)
 
Sinon, pour répondre à francesco, autrefois, il m'arrivait de faire des choses sales comme écrire dans un autre fichier, et faire un mv pour rattraper le coup... mais... une fois dans mon entreprise, on n'avait plus d'espace libre sur le disque d'un serveur, qui était rempli de fichiers de log. Les scripts de nettoyage ne marchaient plus (car ils utilisaient tail vers un fichier temporaire, puis mv)... c'est comme ça, par obligation, qu'on en est venu à ed pour tronquer les fichiers de log.
 
On s'est rendu compte que ed est ultra-performant, car d'abord il charge le fichier d'un coup en RAM, ensuite il fait toutes les modifs en RAM, et finalement il sauvegarde tout d'un coup sur le disque. Donc, si le fichier de départ est le même que le fichier d'arrivée, qu'il est suffisamment petit pour tenir en RAM, on a tout intérêt à utiliser ed.

Reply

Marsh Posté le 14-12-2006 à 15:13:10   

Reply

Marsh Posté le 14-12-2006 à 15:22:39    

franceso a écrit :

Quand je fais ce genre de trucs, en général j'utilise sed ou perl et je passe par un fichier temporaire:
 
mv fichier fichier.tmp
sed -e '...' < fichier.tmp > fichier
rm fichier.tmp

 
EDIT: je viens de voir que perl -i, comme montré par WedgeAnt deux posts au dessus, permet de faire ça directement en place


 
 :jap:  
 
l'option -i.xxx permet de faire les modifs sur place tout en faisant une sauvegarde du fichier en .xxx ... j'adooooore perl  [:dami1stm]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 14-12-2006 à 15:25:07    

C'est vrai que ça peut être intéressant... pas dans mon cas, mais c'est bon à savoir.

Reply

Marsh Posté le 14-12-2006 à 15:47:28    

wedgeant a écrit :

l'option -i.xxx permet de faire les modifs sur place tout en faisant une sauvegarde du fichier en .xxx ... j'adooooore perl  [:dami1stm]

Merci merci... mais je viens juste de voir que sed a aussi cette option. En fait, avec l'option -i activée, sed fait un "move" avec un fichier temporaire, car sed fonctionne ligne par ligne, et a donc techniquement besoin de 2 fichiers simultanés. Je pense qu'avec perl ça doit être pareil... et comme ici le disque n'est pas plein à craquer, je vais utiliser sed :

sed -i '/abc/s/=.*/=salut/' fichier

Quelqu'un dit mieux ?

Message cité 1 fois
Message édité par e-miel le 14-12-2006 à 15:49:42
Reply

Marsh Posté le 14-12-2006 à 15:49:22    

euh, je dirais qu'il va gueuler si tu lui donnes ça à manger hein ...
tu veux pas plutot mettre ton abc dans le s et récuperer le tout ?


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 14-12-2006 à 15:51:25    

J'ai essayé, ça marche nickel ! Tu proposes quoi ?

Reply

Marsh Posté le 14-12-2006 à 16:03:27    

ah bah j'ai rien dit si ça marche :p


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 14-12-2006 à 17:22:38    

e-miel a écrit :

Merci merci... mais je viens juste de voir que sed a aussi cette option. En fait, avec l'option -i activée, sed fait un "move" avec un fichier temporaire, car sed fonctionne ligne par ligne, et a donc techniquement besoin de 2 fichiers simultanés. Je pense qu'avec perl ça doit être pareil... et comme ici le disque n'est pas plein à craquer, je vais utiliser sed :

sed -i '/abc/s/=.*/=salut/' fichier

Quelqu'un dit mieux ?

 

euh /s/abc.*=.*/abc = salut/   ? Je sais pas si ca change grand chose...


Message édité par Xavier_OM le 14-12-2006 à 17:23:13

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 14-12-2006 à 18:48:06    

Non, car

chose=x
abc truc=y
abc bidule=z

doit devenir :

chose=x
abc truc=salut
abc bidule=salut

Reply

Marsh Posté le 14-12-2006 à 19:15:24    

e-miel a écrit :

Non, car

chose=x
abc truc=y
abc bidule=z

doit devenir :

chose=x
abc truc=salut
abc bidule=salut



 
arf autant pour moi, c'est vrai que sous vim j'aurai fais un  
s/\(abc.*=\).*/\1salut/g    :ange:


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Sujets relatifs:

Leave a Replay

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