Insérer caractère

Résolu
Bonjour à tous,

J'utilise la commande shell suivante :

cat $f|tail -n +2|sed "s, ; ,~,g" >> GHI_19667_S_DPD_STATUS_FILE.data

cette commande lit le fichier à partir de la deuxième ligne et remplace les ~ par des ; et envoie la ligne vers le fichier de sortie ! (mais ça vous l'aviez compris)

je voudrais avant l'instruction sed insérer le caractère ; à la 42ème position de la ligne.

Pouvez-vous m'aider :--)

Merci beaucoup

Greg

2 réponses

  1. Contributeur
    Salut,

    On peut avoir un bout de fichier en guise d'exemple ?

    1. Contributeur
      En attendant pour répondre à ta question :

      $ echo "${A}"
      aaaaaaaaaaaaAaaaaaaaaaaaa

      $ sed 's/.\{12\}/&;/' <<<${A}
      aaaaaaaaaaaa;Aaaaaaaaaaaaa

      $ sed 's/.\{13\}/&;/' <<<${A}
      aaaaaaaaaaaaA;aaaaaaaaaaaa


      Sinon, tu n'as pas besoin de
      cat
      et de
      tail
      ,
      sed
      peut tout faire…

      1. Bonjour Zipe31 et merci de ta réponse,

        le fichier ressemble à ceci

        PARCELNO;SCAN_CODE;DEPOT_CODE;DEPOTNAME;EVENT_DATE_TIME;ROUTE;TOUR;PCODE;SERVICE;CONSIGNEE_COUNTRY_CODE;CONSIGNEE_ZIP;ADD_SERVICE_1;ADD_SERVICE_2;ADD_SERVICE_3;WEIGHT;CUSTOMER_REFERENCE;POD_IMAGE_REF;RECEIVER_NAME;INFO_TEXT;LOCATION;
        05348800423004;18;0998;Depot 0998;20200901135128;0000;;01;101;000;;;;;;2586068;;;133:1;;
        05348800423004;18;0998;Depot 0998;20200901135128;0000;;01;101;000;;;;;;5409239;;;133:1;;


        Peux-tu me dire à quoi sert le <<<${A} ?
        Comment remplacerais-tu l'ensemble des commandes par sed ?

        Merci de ton aide ;-)
      2. Contributeur
        @greg11081975
        $ cat f2
        PARCELNO;SCAN_CODE;DEPOT_CODE;DEPOTNAME;EVENT_DATE_TIME;ROUTE;TOUR;PCODE;SERVICE;CONSIGNEE_COUNTRY_CODE;CONSIGNEE_ZIP;ADD_SERVICE_1;ADD_SERVICE_2;ADD_SERVICE_3;WEIGHT;CUSTOMER_REFERENCE;POD_IMAGE_REF;RECEIVER_NAME;INFO_TEXT;LOCATION;
        05348800423004;18;0998;Depot 0998;20200901135128;0000;;01;101;000;;;;;;2586068;;;133:1;;
        05348800423004;18;0998;Depot 0998;20200901135128;0000;;01;101;000;;;;;;5409239;;;133:1;;


        $ sed '1n;s/;/~/g;s/.\{42\}/&;/' f2
        PARCELNO;SCAN_CODE;DEPOT_CODE;DEPOTNAME;EVENT_DATE_TIME;ROUTE;TOUR;PCODE;SERVICE;CONSIGNEE_COUNTRY_CODE;CONSIGNEE_ZIP;ADD_SERVICE_1;ADD_SERVICE_2;ADD_SERVICE_3;WEIGHT;CUSTOMER_REFERENCE;POD_IMAGE_REF;RECEIVER_NAME;INFO_TEXT;LOCATION;
        05348800423004~18~0998~Depot 0998~20200901;135128~0000~~01~101~000~~~~~~2586068~~~133:1~~
        05348800423004~18~0998~Depot 0998~20200901;135128~0000~~01~101~000~~~~~~5409239~~~133:1~~

        Peux-tu me dire à quoi sert le <<<${A} ?
        De la même manière qu'on peut rediriger l'entrée d'un fichier ainsi
        < fichier
        , cette syntaxe fait la même chose mais avec le contenu d'une variable. C'était un exemple pour aller au plus pressé.
      3. @zipe31ok, donc echo récupe le stdin clavier et le met dans la variable A ensuite sed fait le reste ?

        Par contre je ne comprend pas ce que fait 1n --> $ sed '1n;s/;/~/g;s/.\{42\}/&;/' f2

        J'ai essayé de le remplacer par 2n en pensant qu'il allait commencer à la deuxième ligne du fichier mais non...

        Et surtout, encore merci pour tes lumières ;-)
      4. Contributeur
        @greg11081975
        ok, donc echo récupe le stdin clavier et le met dans la variable A ensuite sed fait le reste ?
        Euh… non ! Je t'ai dit que ça c'était un exemple (la variable a été créée avant) pour te montrer comment insérer un caractère à la position adéquate. Ça n'a rien à voir avec ton problème.
        Par contre je ne comprend pas ce que fait 1n
        On demande à sed de lire la 1ère ligne, puis de passer à la ligne suivante (instruction "next" (n)). Donc les instructions qui suivent, s'appliqueront à toutes les autres lignes (sauf la 1ère).
      5. Contributeur
        @greg11081975Mea culpa ;-(

        Je n'avais pas fait attention qu'il fallait sauter les 2 premières lignes.

        Donc :
        sed '2,$ s/;/~/g;s/.\{42\}/&;/'  fichier


        2,$
        on n'applique les instructions qu'après la seconde ligne (2) et ce jusqu'à la fin du fichier ($).