Ksh sed et \n

lucifiel -  
 lucifiel -
Bonjour,

je doit faire modifier un script shell pour du remplacement de texte mais je n arrives pas a placer mon \n dans mon sed et je suis oblige de paser par un tr.

exemple 1

cat $1 | tr "\f" "@" | sed "s,@,#1 #,g" | tr "#" "\n" 


exemple 2

for NUM in $LIGNES
do
	sed "$(( NUM + 11)) s/.*/&#/" $TEMP | sed "$(( NUM + 17)) s/.*/&#/" > $TEMP2
	mv $TEMP2 $TEMP
done
cat $TEMP | tr "#" "\n" > $TEMP2


en suppriant le tr j éliminerai a peur pret 60 operations par fichier de 1 Mo ce qui n est pqs n négligeable ^^

a votre bon coeur monsieur dame ;)

4 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    T'as un exemple de ton fichier à modifier, AVANT => APRÈS s'il te plaît ?
    0
    1. lucifiel
       
      AVANT
      AVENUE LEON BLUM
      
      
                                              XXXXX XXXXX
      
       XXXXXX                 800000044 26800014800018 DF 2            700256
       XXXXXXX                  800000192
       XXXXXXXXXXXX           POUR OBTENIR UN RENSEIGNE            23/10/2009
       XXXXXXXXXXX                CETTE FACTURATION MERCI D R                7021
           CONSEIL REGIONAL DE XXXXXX  ADRESSER AU XX.XX.XX                     1
                                                                            2009
      

      APRES

      1 
       AVENUE LEON BLUM
       
       
                                               XXXXX XXXXX
       
      1 
      
        XXXXXX                 800000044 26800014800018 DF 2            700256
        XXXXXXX                  800000192
        XXXXXXXXXXXX           POUR OBTENIR UN RENSEIGNE            23/10/2009
        XXXXXXXXXXX                CETTE FACTURATION MERCI D R                7021
            CONSEIL REGIONAL DE XXXXXX  ADRESSER AU XX.XX.XX                     1
                                                                             2009
      0
      1. lucifiel > lucifiel
         
        Faites pas attention a celui d avant il est totalement faux ^^'

        Avant =


        C H U AMIENS 800000044 26800014800018 77 1 603702
        LONGS SEJOURS ST VICTOR 800006264
        1 PLA VICTOR PAUCHET POUR TOUT RENSEIGNEMENT C 23/10/2009
        80054 AMIENS CETTE FACTURE MERCI DE VO H 6054
        MR X DE 8H A 16H AU 03.22 1
        X 2009
        YOLANDE
        18/04/1926 TRESORERIE
        CENTRE ST VICTOR 8 RUE EMILE LESOT


        80054 AMIENS 80039 AMIENS
        859968605/016 001590726 FICHAUX YOLANDE
        10 UDAF

        FICHAUX YOLANDE 21-23 RUE FREDERIC PETIT
        226046748245607
        018012146 80048 AMIENS CEDEX 1


        Apres =

        1

        C H U AMIENS 800000044 26800014800018 77 1 603702
        LONGS SEJOURS ST VICTOR 800006264
        23/10/2009
        6054
        MR X 1
        X 2009
        YOLANDE
        18/04/1926 TRESORERIE
        CENTRE ST VICTOR 8 RUE EMILE LESOT


        80054 AMIENS 80039 AMIENS

        859968605/016 001590726 FICHAUX YOLANDE
        10 UDAF

        FICHAUX YOLANDE 21-23 RUE FREDERIC PETIT
        226046748245607
        018012146 80048 AMIENS CEDEX 1
        0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Re-

    Tous tes fichiers sont structurés de la même façon ?
    C'est des lignes vides qu'il y a en début (3) ?
    0
    1. lucifiel
       
      tous structurer de la meme facon, la premiere ligne est une ligne vide.

      script complet :
      #!/bin/bash
      #
      # Script bash de traitement du fichier IM232.txt
      # Utilisation : script fichier-source fichier-destination


      # Le fichier source existe-il ?
      if [ ! -s "$1" ]; then
      echo "Le fichier passe en parametre n'existe pas !"
      echo "Utilisation : $0 fichier"
      exit
      fi

      # Fichiers temporaires (deux a cause du fonctionnement obsolete de Sed)
      TEMP="$$.temp"
      TEMP2="$$.temp2"

      # Alors on degage le ":" de la date, sinon le fichier ne peut pas etre enregister sous Windows
      DATE=$(date +%F_%T | tr ":" "-")

      # Nom du fichier final
      #FINAL="titre2_$DATE.dta"
      FINAL="titre2_$$.dta"

      #######################
      # DEBUT du traitement #
      #######################


      # Suppression des phrases inutiles, et décallage d'un espace vers la droite "sed, c'est bien" (long, mais bien)
      cat $1 | tr "àçéèêëîïôöùüÂÇÉÈÊËÎÏÔÖÙÜ\f" "aceeeeiioouuACEEEEIIOOUU@" | sed -e "s/^/ /;s/FACTURE SE REPORTER/ /g;s/80054 AMIENS PORTER RECLAMATION CONCER [HES]/ /g;s/1 PLA VICTOR PAUCHET POUR OBTENIR UN RENSEIGNE/ /g;s/RESPONSABILITE TAUX A VOTRE CHARGE//g;s/80054 AMIENS CETTE FACTURATION MERCI D R/ /g;s/TARIF DE//g;s/TVA TVA MONTANT HT//g;s/MONTANT//g;s/ADRESSER AU 03.22.66/ /g;s/DE 8H A 16H AU 03.22/ /g;s/1 PLA VICTOR PAUCHET POUR TOUT RENSEIGNEMENT C/ /g;s/80054 AMIENS CETTE FACTURE MERCI DE VO H/ /g" | sed "s,@,#1 #,g" > $TEMP

      # On repere les lignes ou on veut inserer une nouvelle ligne, soit :
      # 1) la 11eme ligne en dessous du code postal (C H U Amiens)
      # 2) la 17eme ligne en dessous du code postal

      LIGNES=$(cat $TEMP | grep -n "C H U AMIENS"| cut -d : -f1)

      for NUM in $LIGNES
      do
      sed "$(( NUM + 11)) s/.*/&#/" $TEMP | sed "$(( NUM + 17)) s/.*/&#/" > $TEMP2
      mv $TEMP2 $TEMP
      done

      # Gestion des "1 " a mettre a la fin des pages, attention faut suivre :
      # Comme la version de sed sur srvgam est un peu obsolete, on est oblige de bricoler pour reussir ce qu'on veut faire (en gros sed voit pas le caractere)
      # on a deja remplacer le FF par un @, on va remplacer ce @ par la sequence #1 #, on remplace les # par des \n
      #sed "s/@/#1 #/g" $TEMP |
      cat $TEMP | tr "#" "\n" > $TEMP2

      # on oublie pas d'ajouter le "1 " en debut de fichier
      echo "1 " > $TEMP


      # Creation du fichier final
      cat $TEMP $TEMP2 > $FINAL

      # On degage les fichiers temporaires
      rm -f $TEMP $TEMP2

      #####################
      # FIN du traitement #
      #####################

      echo "Traitement fini"
      exit
      0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Quelle version de 'sed' ?

    Un truc comme ça, ça ne t'irait pas ?

    jp@MDK:~/tmpfs ssh$ cat plop
    
    C H U AMIENS 800000044 26800014800018 77 1 603702
    LONGS SEJOURS ST VICTOR 800006264
    1 PLA VICTOR PAUCHET POUR TOUT RENSEIGNEMENT C 23/10/2009
    80054 AMIENS CETTE FACTURE MERCI DE VO H 6054
    MR X DE 8H A 16H AU 03.22 1
    X 2009
    YOLANDE
    18/04/1926 TRESORERIE
    CENTRE ST VICTOR 8 RUE EMILE LESOT
    
    
    80054 AMIENS 80039 AMIENS
    859968605/016 001590726 FICHAUX YOLANDE
    10 UDAF
    
    FICHAUX YOLANDE 21-23 RUE FREDERIC PETIT
    226046748245607
    018012146 80048 AMIENS CEDEX 1
    
    jp@MDK:~/tmpfs ssh$ cat fich.sed
    n
    n
    n
    s/.* //
    n
    s/.* //
    n
    s/\([^ ]*.[^ ] *\).* \(.*\)/\1\2/
    :z
    n
    /^$/ !b z
    :y
    n
    /^$/ b y
    n
    s/.*/\n&/
    :w
    n
    $ !b w
    
    jp@MDK:~/tmpfs ssh$ sed -f fich.sed plop
    
    C H U AMIENS 800000044 26800014800018 77 1 603702
    LONGS SEJOURS ST VICTOR 800006264
    23/10/2009
    6054
    MR X 1
    X 2009
    YOLANDE
    18/04/1926 TRESORERIE
    CENTRE ST VICTOR 8 RUE EMILE LESOT
    
    
    80054 AMIENS 80039 AMIENS
    
    859968605/016 001590726 FICHAUX YOLANDE
    10 UDAF
    
    FICHAUX YOLANDE 21-23 RUE FREDERIC PETIT
    226046748245607
    018012146 80048 AMIENS CEDEX 1
    
    jp@MDK:~/tmpfs ssh$
    
    ;-))
    0
    1. lucifiel
       
      ca me met des n au lieu des \n

      et je comprends pas le fichier fich.sed xD
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lucifiel
       
      Tu bosses sous quel système ? Win ou Unix/Linux ?
      0
    3. lucifiel > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      je bosse sous AIX 5.2
      0
    4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lucifiel
       
      Quelle version de "sed" ? (sed --version)
      0
    5. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lucifiel
       
      n
      n
      n

      Commande next. On passe à la ligne suivante (3 fois)

      s/.* //
      On substitue tout ce qui se trouve entre le début de la ligne et le dernier espace (on joue ici sur la gourmandise des regex)

      n
      On passe à la ligne suivante

      s/.* //
      Idem.

      n
      On passe à la ligne suivante

      s/\([^ ]*.[^ ] *\).* \(.*\)/\1\2/
      Grâce aux sous-expressions (voir la FAQ), on récupère les 2 morceaux de la ligne qui nous intéressent.

      :z
      Étiquette

      n
      On passe à la ligne suivante

      /^$/ !b z
      Si la ligne n'est pas vide, on boucle sur l'étiquette

      :y
      Étiquette

      n
      On passe à la ligne suivante

      /^$/ b y
      Si la ligne est vide, on boucle sur l'étiquette

      n
      On passe à la ligne suivante

      s/.*/\n&/
      On substitue toute la ligne par un saut de ligne suivi de la ligne elle même

      :w
      Étiquette

      n

      On passe à la ligne suivante

      $ !b w
      Tant qu'on n'a pas atteint la dernière ligne, on boucle

      0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Sinon pour tes "Form Feed", essaie ça :
    jp@MDK:~/tmpfs ssh$ cat -A toto
    Bonjour ^L$
    
    jp@MDK:~/tmpfs ssh$ sed 's/'$(echo "\x0C")'/'$(echo "\x0A")'/' toto
    Bonjour
    
    jp@MDK:~/tmpfs ssh$ sed 's/'$(echo "\x0C")'/'$(echo "\x0A")'/' toto | cat -A
    Bonjour $
    $
    jp@MDK:~/tmpfs ssh$
    
    ;-))
    0
    1. lucifiel
       
      j obtiens :

      sed : 0602-403 /\x0C/\x0A/ n'est pas une fonction reconnue
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lucifiel
       
      En changeant le $(...) par `...` peut être :

      sed 's/'`echo "\x0C"`'/'`echo "\x0A"`'/' toto
      
      0
    3. lucifiel > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      j ai put l erreur mais ca modifie pas la form feed ....
      0
    4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lucifiel
       
      Même en redirigeant la sortie vers un autre fichier ?
      0
    5. lucifiel > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      oui meme comme ca .....
      0