Forum Programmation.autre Remplacer tout simplement

Posté par  .
Étiquettes : aucune
0
20
déc.
2006
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
  • # oups

    Posté par  . É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  . É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  . É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)
      • [^] # Re: oups

        Posté par  . É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  . É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  . É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  . É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  . É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  . É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  . Évalué à 1.

              il manque pas un 'cat fichier | awk ... | sed' ?
            • [^] # Re: Avec sed ?

              Posté par  . É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  (site web personnel) . É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  . É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  . É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 ....

Suivre le flux des commentaires

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