Programmation.autre : Remplacer tout simplement
Posté par ArLouarn Mog () le 20 décembre 2006
0
Salut à tous,Voila, je souhaiterais tout simplement remplacer une chaine de caractères d'un champs précis dans un fichier qui ressemble a ca:
aa1231231231aaa bbbb8888bb ccccccccccc
ddddd eeeeeeeee5957595759eeeeeeeeeee
aaaaaaaaaaaaaaa bbbbb5555 bbbb63411bb
ddddd ggggggggggg89898989ggggggggggg
En gros, comment je peux remplacer la chaine de caractère "5759e" du 4eme champs par la chaine de caractère "1111b" et la chaine de caractère "g8989" par "k5432" ?
Merci d'avance
> Lire le message (14 commentaires, moyenne: 1,3).
Vous avez demandé le commentaire #786676.



Avec sed ?
Peut-être ai-je mal compris mais...
$ cat fichier_source | sed -e 's/5759e/1111b/' > nouveau_fichier
Cela remplace globalement tous les "5759e" par des "1111b". Ça fonctionne donc dans l'hypothèse où tu souhaite remplacer toutes les occurrences.
Tu peux répéter la commande, ou re-piper pour faire un second remplacement.
$ cat fichier_source | sed -e 's/5759e/1111b/' | sed ... > nouveau_fichier
Ou donner plusieurs instructions à sed.
$ cat fichier_source | sed -e 's/5759e/1111b/; s/g8989/k5432/' > nouveau_fichier
[ Répondre ]
[^]Re: Avec sed ?
Ok alors d'après ton dernier message, j'avais rien pigé à ce que tu souhaitais... désolé pour le bruit.
[ Répondre ]
[^]Re: Avec sed ?
Merci quand même.
Il y a une petite chose qui est importante, c'est le "numéro" du champ.
Je ne peux pas remplacer par exemple la chaîne 6545 du champs 57733 parceque je ne dois modifier que la chaine de caractère 6545 du champs 5. J'avais peut être mal précisé mais la chaine 6545 peut quand même se retouver ailleurs dans mon fichier. Comme une date par exemple.
Suis je clair ?
[ Répondre ]
[^]Re: Avec sed ?
Par exemple
grep 060620401 fichier.old | sed -e '200s/060620401/777777777/' > fichier.new change bien le premier champ à la 200eme ligne, mais je ne sais pas comment changer le 4eme champ par exemple de cette 200eme ligne ...
[ Répondre ]
[^]Re: Avec sed ?
bon j'avance .... sauf qu'une fois la commande lancée, et même si elle fait son boulot, je ne reviens pas au prompt ....
#awk '{print $3}' | sed -e '680s/5555/7777/' fichier.old > fichier.new
Cela me permet donc de changer la chaine de caractère 5555 par 7777 sur le 3eme champs de la ligne 680 ....
[ Répondre ]
[^]Re: Avec sed ?
il manque pas un 'cat fichier | awk ... | sed' ?
[ Répondre ]
[^]Re: Avec sed ?
ouais, ton pb c'est que le awk '{print $3}' sert à rien. Il attends des trucs sur l'entrée standard, dans ton cas le clavier puisqu'il n'y a pas de pipe avant la commande.
le sed, faut virer l'option -e fichier.old sinon il prends pas sur l'entrée standard.
donc en résumé : cat fichier.old | awk '{print $3}' | sed -e '680s/5555/7777/' > fichier.new
Mais la tu vas perdre toutes les autres colonnes, ce qui est pas top.
peut être qu'un truc du genre :
cat fichier.new | awk ' $3=tachaine { print $1 $2 remplacement $* ;}
$3 != tachaine { print laligne } ;
'
marcherait, mais c'est avec mes souvenir de awk, $* existe sans doute pas, laligne c'est un caractère à rechercher dans le man.
[ Répondre ]
[^]Re: Avec sed ?
la ligne complète, c'est $0, donc le script awk peut ressembler à :
$3~/tachaine/ {sub(/tachaine/,"remplacement",$3)}
1 {print $0}
En fait, si tu fais dans le cas où $3 est machin, changer machin puis ecrire, dans le cas ou $3 n'est pas machin, ecrire, il va ecrire les deux : il fait les tests sequentiellement... C'est pour ça que je n'ai mis qu'un print $0. Le fait de faire le remplacement directement dans $3 modifie effectivement la ligne comme on veut.
[ Répondre ]