Bash sed

pecom Messages postés 33 Statut Membre -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je me demandais s'il étais possible d'obtenir le résultat que je cherche avec la commande SED.

je lis un fichier ligne par ligne
lorsque je suis sur la ligne qui contient From:
alors j'ai 2 cas de possible
cas 1 : From: Paul <paul@paul.com>
cas 2 : From: (toto@toto.com) Toto

Dans les 2 cas, après traitement, je dois obtenir :
Paul:paul@paul.com
Toto:toto@toto.com

Alors j'espere que quelqun va pouvoir répondre à ma question ! merci !

3 réponses

  1. dna.factory Messages postés 19915 Date d'inscription   Statut Modérateur Dernière intervention   1 621
     
    personnellement, j'utiliserais en awk
    (soit précédé d'un sed pour changer les ( en < et les > en ) ou inversement, soit avec de la conditionnelle)
    0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    $ cat plop 
    je lis un fichier ligne par ligne
    lorsque je suis sur la ligne qui contient From:
    alors j'ai 2 cas de possible
    From: Paul <paul@paul.com>
    From: (toto@toto.com) Toto
    
    $ cat fich.sed 
    /^From/{
    /</{
    s/.*: \|>//g
    s/ </:/
    }
    /(/{
    s/.*(//
    s/\(.*\)) \(.*\)/\2:\1/
    }
    }
    
    $ sed -f fich.sed plop 
    je lis un fichier ligne par ligne
    lorsque je suis sur la ligne qui contient From:
    alors j'ai 2 cas de possible
    Paul:paul@paul.com
    Toto:toto@toto.com
    
    $

    :-))
    0
    1. Pecom
       
      Merci de ta reponce ! Malheureusement je ne peux utiliser awk pour l'instant .... Contrainte d'ecole ... Pourrais tu un peu detailler les etapes que tu as ecrites sa m'aiderais beaucoup pour comprendre puisque je commence a programmer... En plus que sed a l'air assée complexe ...

      Merci !
      0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    $ cat a1
    Je lis un fichier ligne par ligne
    lorsque je suis sur la ligne qui contient From:
    alors j'ai 2 cas de possible
    From: Paul <paul@paul.com>
    From: (toto@toto.com) Toto 
    $ 
    $ awk -F"[<>:() ]" '/^From:.*\(/ {print $6 ":" $4 ; next} /^From.*</ {print $3 ":" $5 ; next} {print}' a1
    Je lis un fichier ligne par ligne
    lorsque je suis sur la ligne qui contient From:
    alors j'ai 2 cas de possible
    Paul:paul@paul.com
    Toto:toto@toto.com
    $
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      Si le nom est composé (Jean Paul ou Toto Titi), ce qui arrive souvent dans les noms qui apparaissent en regard des adresses mail, ça foire ;-\
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      effectivement
      $ cat a1
      Je lis un fichier ligne par ligne
      lorsque je suis sur la ligne qui contient From:
      alors j'ai 2 cas de possible
      From: Paul le poulpe <paul@paul.com>
      From: (toto@toto.com) Toto Cutugno 
      $ 
      $ awk -F"[<>:()]" '/^From:.*\(/ {gsub("^ | $", "",$4);print $4  ":" $3 ; next} /^From.*</ {gsub("^ | $", "", $2) ; print $2 ":" $3 ; next} {print}' a1
      Je lis un fichier ligne par ligne
      lorsque je suis sur la ligne qui contient From:
      alors j'ai 2 cas de possible
      Paul le poulpe:paul@paul.com
      Toto Cutugno:toto@toto.com
      
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Merci ;-))
      0
    4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      on ne peut plus modifier ses posts ?
      version optimisée
      $ awk -F"[<>:()]" '/^From:/ {if($0 ~ "[(]"){c1=4 ; c2=3} else {c1=2 ; c2=3} ; gsub("^ | $", "",$c1);print $c1 ":" $c2 ; next} {print}' a1
      Je lis un fichier ligne par ligne
      lorsque je suis sur la ligne qui contient From:
      alors j'ai 2 cas de possible
      Paul le poulpe:paul@paul.com
      Toto Cutugno:toto@toto.com
      $ 
      $ 
      
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      on ne peut plus modifier ses posts ?
      Non. On est revenu à l'ancienne vu les abus répétés avec cette fonction.
      On peut néanmoins éditer son post pendant 3 minutes.
      0