Insérer caractère

Résolu
greg11081975 -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
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. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

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

    0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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…

    0
    1. greg11081975
       
      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 ;-)
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > 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é.
      0
    3. greg11081975 > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
       
      ok, 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 ;-)
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > 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).
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > greg11081975
       
      Mea 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 ($).
      0