Retourner aux forums || Retourner au forum Programmation.autre

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).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

oups

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

j'ai oublié de préciser que je souhaite remplacer la chaine de caractère "g8989" par "k5432" dans le 10eme champs ....

Mais vous l'avez noté je pense :)

  • [^]Re: oups

    Posté par Cheneson Cyril () le 20/12/2006 à 16:51. (lien). Évalué à 1.

    Comment tes champs sont delimitees?
    Donne plus d infos sur comment sont composes/definies tes champs parce que la, je ne voies pas quelle groupe de caracteres appartient a quel champ

  • [^]Re: oups

    Posté par nats (Jabber id, page perso, ) le 20/12/2006 à 16:51. (lien). Évalué à 1.

    Bah je dirais que le principe de base est de retrouver ta sous chaine si elle est unique, et de la remplacer. Sinon aller à l'offset concerné directement.
    Mais tu as un langage particulier en tête ?
    Parce que pour travailler sur les chaines y a quand meme pas mal de differences... (au niveau fonctions et methodes disponibles)

    --
    On vous ment! Mais pas moi...
    • [^]Re: oups

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

      Les champs sont délimités par des espaces variables. Dans le fichier original que je souhaite modifier (mais que je ne peux déposer ici ... :) c'est une document comptable), il y a 6 champs séparés toujours par le même nombre d'espaces ( 6 espaces entre 1er et 2eme champs, 3 entre 2 et 3, 1 entre 3 et 4, 1 entre 4 et 5 et enfin 1 entre 5 et 6). Ces 6 champs sont bien sur "répétés" (ce n'est bien sur pas les mêmes chaines de caractères) des milliers de fois

      Le truc c'est que lorsqu'on me demande cela, c'est aléatoire, en gros, on peut me dire de modifier le champ 4 ou le champ 64 etc.

      Ce que je souhaite c'est un script ou une commande (j'ai essayé avec sed mais ca n'a pas donné le résultat escompté) qui puisse me permettre de simplement modifier une chaine de caractère dans le champs 5753 par exemple. Parceque remplacer 5555 par 6666 dans le 5eme champs ca se fait facilement à la main mais trouver le champ 48521, c'est un peu plus chaud.

      Sous sed, j'avais essayé un truc du style :
      sed "2s/6706/7777/" fichier.old> fichier.new mais bof donc ....

      Merci

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

  • [^]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.

    • [^]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 ?

      • [^]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 ...

        • [^]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 ....

          • [^]Re: Avec sed ?

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

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

          • [^]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.

            • [^]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.

sed & awk

Posté par dguihal () le 21/12/2006 à 09:37. (lien). Évalué à 2.


cat fichier.old | tr -d '\n' | \
sed -e 's/ */ /g' | \
tr ' ' '\n' | \
awk -v numligne=$NUMLIGNE -v strin=$STRIN -v srtout=$STROUT'
NR == numligne {
gsub(strin, strout);
} ' > fichier.new

Non testé mais ça ne devrait être pas trop loin de la vérité

  • [^]Re: sed & awk

    Posté par ArLouarn Mog () le 21/12/2006 à 11:38. (lien). Évalué à 1.

    bon avec :

    {
    if ( NR == 2 )
    {
    sub("bbb","xxx",$5) ;
    }
    print
    }


    ca marche aussi sauf ... que mes espaces sont réduits entre mes champs et positionnés à 1 espace ....

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.autre