Substitution ? [Résolu] - Codes et scripts - Linux et OS Alternatifs
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
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.
Marsh Posté le 14-12-2006 à 14:38:44
tu as essayé ?
Marsh Posté le 14-12-2006 à 14:43:11
ed est obligatoire ou tu peux utiliser sed ?
Marsh Posté le 14-12-2006 à 14:43:36
Ceci ?
ed fichier <<- EOF |
Evidemment !
Marsh Posté le 14-12-2006 à 14:45:35
ou alors tu le fais en perl carrément ...
perl -pi.bak -e 's/abc (\w+)=(\w+)/abc $1=salut/g;' fichier |
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 ?
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
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.
Marsh Posté le 14-12-2006 à 15:22:39
franceso 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
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.
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 |
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 ?
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 ?
Marsh Posté le 14-12-2006 à 16:03:27
ah bah j'ai rien dit si ça marche
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 :
Quelqu'un dit mieux ? |
euh /s/abc.*=.*/abc = salut/ ? Je sais pas si ca change grand chose...
Marsh Posté le 14-12-2006 à 18:48:06
Non, car
chose=x |
doit devenir :
chose=x |
Marsh Posté le 14-12-2006 à 19:15:24
e-miel a écrit : Non, car
doit devenir :
|
arf autant pour moi, c'est vrai que sous vim j'aurai fais un
s/\(abc.*=\).*/\1salut/g
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