(sed) Enlever le

Résolu
Bonjour à tous,

j'ai un nouveau petit point à traiter avec sed, dont j'ai besoin de votre aide,

ce fichier contient sur chaque fin de ligne ou il y'a un retour chariot "=", quand j'ai fais set list, j'ai detecté qu'aprés chaque "=" , y'a un caractére caché "$",

comment peut on enlever ce caractére "=" et le caractére caché "$" qui va éleminer le retour chariot?

ex fichier :

@|99|OR|99|CT|200611061008|2006|1||PE|ACTES||||
B|2006|1|12|8130|121101200000001072|2006|1079|9|AAAAAA =
AAAAAAAAA|495.0|N|6758|19/04/2006|270||||0.0|P|D668161|31/08/2006|indemnit=
e forfaitaire du 01/06/2006 au 31/08/2006|0.0|||||||||C| | |
B|2006|1|12|8131|121101200000001072|2006|1079|9|BBBB =
BBBBBBB|495.0|N|6758|19/04/2006|270||||0.0|P|Z346370|31/08/2006|indemnit=
e forfaitaire du 01/06/2006 au 31/08/2006|0.0|||||||||C| | |
&|2|

le resultat attendu c est :

@|99|OR|99|CT|200611061008|2006|1||PE|ACTES||||
B|2006|1|12|8130|121101200000001072|2006|1079|9|AAAAAA AAAAAAAAA|495.0|N|6758|19/04/2006|270||||0.0|P|D668161|31/08/2006|indemnite forfaitaire du 01/06/2006 au 31/08/2006|0.0|||||||||C| | |
B|2006|1|12|8131|121101200000001072|2006|1079|9|BBBB BBBBBBB|495.0|N|6758|19/04/2006|270||||0.0|P|Z346370|31/08/2006|indemnit
e forfaitaire du 01/06/2006 au 31/08/2006|0.0|||||||||C| | |
&|2|

le résultat doit contenir 4 lignes.

D'avance merci,

Cordialement,

21 réponses

Résumé de la discussion

Un fichier présente une terminaison par le signe '=' à la fin de chaque ligne, puis un caractère '$' caché, ce qui empêche la suppression correcte du retour chariot. Plusieurs propositions utilisent sed pour supprimer le signe '=' en fin de ligne et éliminer le caractère caché, avec des commandes comme sed 's/=$//g' ou sed -i 's/=\r$//'. D'autres évoquent Perl ou un remplacement des retours chariot et des espaces, par exemple avec perl -ne 's/=\r?\n?//g' ou -i pour modifier directement le fichier. Le résultat attendu doit préserver les contenus utiles sur quatre lignes, en retirant les segments '= et le caractère $' afin d'obtenir des lignes homogènes sans retour chariot caché.

Bobot (l’IA à votre service)
  1. Modérateur
    Ben, moi je ne l'ai pas enlevé :-))
    et tu ne l'a jamais dit; ça explique l'échec de la commande (le \r n'existe plus)

    que te donne
    # perl -ne 's/=\n//; print' mfm1dYJbFc_test.dc | wc -l 
    --
    lami20j
    1. :-))) , que ca marche ;

      Merci beaucoupppppppppppppppp

      formidableeeeeeeeeeeeeeeeeeee

      vive CCM

      je vous remercie tousssssssssssssss
  2. bonjour,

    voila j'ai exécuté les meme commande et voila le résultat :

    # perl -ne 'print' mfm1dYJbFc_test.dc | wc -l
    141

    # perl -ne 's/=\r\n//; print' mfm1dYJbFc_test.dc | wc -l
    141

    pourtant c'est le meme fichier,

    y'a une seule chose que je le fais normalement avant le traitement de ce fichier , c est enlever ^M quand je le transfére du windows a unix. ( en éxutant un script dos2unix.sh)
    1. Modérateur
      Par exemple si je compte le nombre de = suit d'un carriage return j'obtiens 98 qui veut dire

      140 - 98 = 42 donc le résultat que j'obtiens

      calculer le nombre d'occurence = suit de carriage return
      $ perl -e 'print scalar(map{/=\r\n/}`cat mfm1dYJbFc_test.dc`),"\n"'
      98
      1. Bonjour,

        j'ai consulter le fichier (mit2uTW4mo_suppegal_test.dc),tout a fait c'est ca le résultat que je cherche !!!

        je procéderais le lundi a faire la meme manipulation, et je vous tienderais au courant,

        Merci beaucoup pour votre réactivité, et esperant que j obtienderais le meme résultat!!!

        Merci encore une fois
    2. Modérateur
      Salut,

      $ perl -ne 'print' mfm1dYJbFc_test.dc | wc -l
      140
      le fichier original a 140 lignes
      $ perl -ne 's/=\r\n//;print' mfm1dYJbFc_test.dc | wc -l
      42
      le fichier après la suppresion (ici je fais juste un teste sans sauvegarder les modifications) de = et fin de ligne a 42 lignes
      $ perl -ne 's/(.)/ord($1)/eg;print' mfm1dYJbFc_test.dc > ascii_test.dc
      dans ce fichier je converti les caractères en code ASCII
      tu va remarquer à la fin de certains lignes 6113 (chez toi je ne vois pas ça) - c'est = et carriage return
      $ perl -ne 's/=\r\n//;print' mfm1dYJbFc_test.dc > suppegal_test.dc
      je supprime = et caractère de fin de ligne et je sauvegarde le fichier
      $ cat ascii_test.dc | wc -l
      140
      le fichier original (les caractères en ascii cette fois ci) a toujours 140 lignes
      $ cat suppegal_test.dc | wc -l
      42
      le fichier obtenu a 42 lignes

      Voici le fichier avec les caractères convertis en ASCII https://www.cjoint.com/?mit1YbzzmU
      et le fichier obtenu après la suppression https://www.cjoint.com/?mit2uTW4mo
      1. Modérateur
        C'est bizarre.

        Je verrai ce soir.
        Tu peux compresser le fichier et le passer par e-mail (regarde mon profil)
        1. Modérateur
          Il y a quelque chose qui ne va pas

          tu vois les lignes qui se finissent avec 61?
          61 c'est le code ASCII pour =
          donc après 61 on devrait avoir 13 (enfin c'est ça que j'ai obtenu sur ton fichier que tu m'as donné par cjoint.com)

          Tu travailles sur une portion de fichier ou sur le fichier entier?

          1. oui je travaille sur le meme fichier mfm1dYJbFc_test.dc (cjoint)
        2. Modérateur
          oups, c'est ma faute, j'ai oublié le print :-)
          perl -ne 's/(.)/ord($1)/eg;  print' mfm1dYJbFc_test.dc 
          1. voila le résultat :

            perl -ne 's/(.)/ord($1)/eg; print' mfm1dYJbFc_test.dc

            641245757124798212457571246784124504848544949485449484856124504848541244912412480691246567846983124124124124
            661245048485412449124495012456495148124495049494849504848484848484849485550124504848541244948555712457124798566697675656769773261
            6983836565687365124525753464812478124545553561244957474852475048485412450554812412412412448464812480124685454564954491245149474856475048485412410511010010110911010511661
            10132102111114102971051169710511410132100117324849474854475048485432971173251494748564750484854124484648124124124124124124124124124671243212432124

            merci,
          2. @titexepour info,

            le résultat : ca etais plusieurs lignes ou il y'a des numéros, j ai fait une copie seulement des premiéres lignes
        3. Modérateur
          Attention,

          je n'ai pas dit /usr/test >
          tape ça
          perl -ne 's/(.)/ord($1)/eg' mfm1dYJbFc_test.dc 
          1. perl -ne 's/(.)/ord($1)/eg' mfm1dYJbFc_test.dc

            il m'affiche rien du tt
        4. Modérateur
          Salut,

          affiche
          perl -ne 's/(.)/ord($1)/eg' fichier_original
          --
          lami20j
          1. bonjour,

            /usr/test > perl -ne 's/(.)/ord($1)/eg' mfm1dYJbFc_test.dc

            il m'affiche rien
        5. bonjour,

          pardonnez moi , je comprends pas pourquoi ca marche pas chez moi, voila qu es ce que j ai fait ?

          /usr/test > sed 's/=*^M$//' mfm1dYJbFc_test.dc | cat –t

          @|99|OR|99|CT|200611061008|2006|1||PE|ACTES||||
          B|2006|1|12|8130|121101200000001072|2006|1079|9|OUBELKACEM =
          ESSAADIA|495.0|N|6758|19/04/2006|270||||0.0|P|D668161|31/08/2006|indemnit=
          e forfaitaire du 01/06/2006 au 31/08/2006|0.0|||||||||C| | |
          B|2006|1|12|8131|121101200000001072|2006|1079|9|OURYA =
          OUIDYANE|495.0|N|6758|19/04/2006|270||||0.0|P|Z346370|31/08/2006|indemnit=
          e forfaitaire du 01/06/2006 au 31/08/2006|0.0|||||||||C| | |
          &|2|

          comment vous expliquez ca ?

          je compte sur vous pour m'aider a résoudre ce probléme, merci d'avance.

          Cdlt
          1. Modérateur
            Salut,

            Essaye ça :
            sed 's/=*^M$//' mfm1dYJbFc_test.dc | cat -t 
            Le "^M" s'obtient par la combinaison de touches :
            (CTRL+V) + (CTRL+M)

            ;-))
            1. bonjour,

              je sais pas pourquoi ca marche pas chez moi , je l'ai testé plusieurs fois , sous unix et windows et toujours le meme résultat?
              1. meme en perl , chér ami !!
                ca marche pas , le retour chariot existe toujours !!

                Merci d'avance
                1. Modérateur
                  salut,

                  alors passe moi ton fichier sur cjoint.com et je vais voir

                  merci
              2. Modérateur
                Re,

                la commande n'était pas bonne

                essaie
                perl -pi.orig -e 's/=\s*\r?\n?//' fichier
                --
                lami20j
                1. Modérateur
                  Essaie ça
                  perl -pi.orig -e 's/(\d=)\r?\n?/$1/' fichier
                  --
                  lami20j
                  1. meme résultat que la derniére commande sed!!
                2. Modérateur
                  Essaie
                  sed -i.orig s/=[\r\n]+// fichier
                  --
                  lami20j
                  1. ca marche pas !!!
                3. Modérateur
                  Oups,

                  essaie comme ça
                  sed -i.orig s/=[\r\n]*// fichier
                  j'ai oublié le s
                  1. re,

                    ça marche !! mais les retours chariot existe toujours,

                    Merci
                4. Modérateur
                  Salut,
                  sed -i.orig /=[\r\n]*// fichier
                  Il faut l'option -i pour editer le fichier en place

                  Après = il y a un \r ou \n qu'il faut le supprimer.

                  Je n'ai pas testé :-) mais -i.orig sauvegarde le fichier
                  1. Bonjour Lami20j,

                    ca va ?

                    meme avec cette derniére commande et ca marche pas ;

                    D:\Program Files\GnuWin32\bin>sed -i.orig /=[\r\n]*// F0007913.dc
                    sed: -e expression #1, char 11: unknown command: `/'

                    D:\Program Files\GnuWin32\bin>sed -i /=[\r\n]*// F0007913.dc
                    sed: -e expression #1, char 11: unknown command: `/'

                    Merci d'avance
                • 1
                • 2