Bash sed

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. Modérateur
    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
    1. Contributeur
      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. 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
    2. Contributeur
      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. Contributeur
        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. Contributeur
        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. Contributeur
        Merci ;-))
        0
      4. Contributeur
        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. Contributeur
        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