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 #786678.

Avec sed ?

Posté par omnikron () le 20/12/2006 à 17:11. (lien). Évalué à 2.

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 ?

    Posté par omnikron () le 20/12/2006 à 17:13. (lien). Évalué à 1.

    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 ?

      Posté par ArLouarn Mog () le 20/12/2006 à 17:23. (lien). Évalué à 1.

      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 ?

        Posté par ArLouarn Mog () le 20/12/2006 à 17:50. (lien). Évalué à 1.

        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 ?

          Posté par ArLouarn Mog () le 20/12/2006 à 18:05. (lien). Évalué à 1.

          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 ?

            Posté par Thomas Douillard () le 20/12/2006 à 18:13. (lien). Évalué à 1.

            il manque pas un 'cat fichier | awk ... | sed' ?

            [ Répondre ]

            [^]Re: Avec sed ?

            Posté par Thomas Douillard () le 20/12/2006 à 18:23. (lien). Évalué à 2.

            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 ?

              Posté par Ernest H (Jabber id, ) le 21/12/2006 à 09:26. (lien). Évalué à 2.

              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 ]