Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1887 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [Résolu] Substitution ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Substitution ?

n°871076
e-miel
Posté le 14-12-2006 à 14:22:31  profilanswer
 

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
mood
Publicité
Posté le 14-12-2006 à 14:22:31  profilanswer
 

n°871080
wedgeant
Da penguin inside
Posté le 14-12-2006 à 14:24:15  profilanswer
 

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
n°871084
e-miel
Posté le 14-12-2006 à 14:30:45  profilanswer
 

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.

n°871090
wedgeant
Da penguin inside
Posté le 14-12-2006 à 14:38:44  profilanswer
 

tu as essayé ? :gratgrat:


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°871096
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 14-12-2006 à 14:43:11  profilanswer
 

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.
n°871097
e-miel
Posté le 14-12-2006 à 14:43:36  profilanswer
 

Ceci ?

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

Evidemment !

n°871098
wedgeant
Da penguin inside
Posté le 14-12-2006 à 14:45:35  profilanswer
 

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
n°871099
e-miel
Posté le 14-12-2006 à 14:45:54  profilanswer
 

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 ?

n°871101
franceso
Posté le 14-12-2006 à 14:51:48  profilanswer
 

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
n°871114
e-miel
Posté le 14-12-2006 à 15:13:10  profilanswer
 

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.

mood
Publicité
Posté le 14-12-2006 à 15:13:10  profilanswer
 

n°871117
wedgeant
Da penguin inside
Posté le 14-12-2006 à 15:22:39  profilanswer
 

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
n°871118
e-miel
Posté le 14-12-2006 à 15:25:07  profilanswer
 

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

n°871124
e-miel
Posté le 14-12-2006 à 15:47:28  profilanswer
 

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
n°871126
wedgeant
Da penguin inside
Posté le 14-12-2006 à 15:49:22  profilanswer
 

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
n°871127
e-miel
Posté le 14-12-2006 à 15:51:25  profilanswer
 

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

n°871131
wedgeant
Da penguin inside
Posté le 14-12-2006 à 16:03:27  profilanswer
 

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


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°871153
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 14-12-2006 à 17:22:38  profilanswer
 

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.
n°871162
e-miel
Posté le 14-12-2006 à 18:48:06  profilanswer
 

Non, car

chose=x
abc truc=y
abc bidule=z

doit devenir :

chose=x
abc truc=salut
abc bidule=salut

n°871166
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 14-12-2006 à 19:15:24  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [Résolu] Substitution ?

 

Sujets relatifs
[Résolu] Mettre un fichier dans un mail via la commande mail[resolu] ouverture open office lente
[résolu] [Apache] - Problème avec "getaddrinfo", résolution de nom DNSrésolu partiellement[mdv2007] cordless rumblepad config joypad
[résolu] installer le réseau wifi via la konsole[Résolu] UTF-8 après un reset
[résolu] comment installer connexion adsl sur mandriva one 2007[Résolu, ou pas]imapsync : ça marche pas!
[resolu] FreeBSD emacs et la touche finrésolu [mandriva2007] nautilus sendto bluetooth
Plus de sujets relatifs à : [Résolu] Substitution ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR