Remplacer chaîne caractere par nombre2

Résolu/Fermé
Utilisateur anonyme -  
baladur13 Messages postés 47332 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je reviens vers vous car la commande "sed" m'enerve trop:

j'ai un fichier composé de 8 champs séparés par ":" et contenant les lignes suivantes:

01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 : daniel loiseau gamme,333436418-37,94310,orly

01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 : ede ruy,304914211-20,69200,venissieux

01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 : marcu havouis sonia simone,321149312-43,75011,paris 11

sur le champ 8 qui est composé lui meme de 4 champs séparés par "," je veux garder que le 2eme chmp comme ceci:

01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 : 333436418-37

01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 : 304914211-20

01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 : 321149312-43

j'ai essayé toutes les possibilité de remplacement mais toutes les formules ne marche pas!! est ce que quelqu'un pourra m'aider svp??

2 réponses

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

    [jp@MDK-2010 tmpfs]$ cat siham 
    01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 : daniel loiseau gamme,333436418-37,94310,orly
    
    01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 : ede ruy,304914211-20,69200,venissieux
    
    01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 : marcu havouis sonia simone,321149312-43,75011,paris 11
    
    [jp@MDK-2010 tmpfs]$ sed -r 's/(.*:)([^,]*),([^,]*),(.*)/\1\3/' siham 
    01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 :333436418-37
    
    01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 :304914211-20
    
    01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 :321149312-43
    
    [jp@MDK-2010 tmpfs]$

    ;-))
    0
    1. Utilisateur anonyme
       
      bonjour et merci pour la réponse. en fait j'ai essayé de suivre la regle :
      sed 's/\(chaine1\) \(chaine2\) \(chaine3\) /\3:\2:/'
      et donc moi je remplace chaque chaîne par sa correspondance dans le fichier à traiter exemple ma 2ème chaîne dans mon fichier est un nombre de 9 chiffres donc j'ecris ([0-9]{9}) ainsi de suite. et pour le remplacement j'ecris /\2/' comme je veux remplacer tout mon champ par la 2eme chaîne de caractere. en gros:
      dans votre formule j'ai compris que vous avez ecrit que 3 chaines et vous avez dit "remplace la 1ere par la troisieme [ ou la 3ème par la 1ère :-( ] mais je n'ai pas compris le reste (.*:)([^,]*),([^,]*),(.*)?? est ce que vous pouvez m'expliquer svp?
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      dans votre formule j'ai compris que vous avez ecrit que 3 chaines et vous avez dit "remplace la 1ere par la troisieme [ ou la 3ème par la 1ère :
      En fait non. Il y a 4 chaines de référence.

      (.*:)
      Chaine 1. Ici on joue sur la gourmandise des regex en capturant tout jusqu'au dernier ":" (deux points)



      ([^,]*),
      Chaine 2. Ici on capture tout jusqu'à ce qu'on rencontre une virgule, qui n'est donc pas compris dans la capture.



      ([^,]*),
      Chaine 3. Idem que précédemment. C'est d'ailleurs cette chaine qui nous intéresse ;-)


      (.*)
      Chaine 4. Le reste jusqu'à la fin de la ligne.

      Ensuite on ne replace que la chaine \1 et la chaine \3.

      En fait avec les chaines 2 et 3 on capture ce qui se trouve entre les virgules.

      ;-))
      0
    3. Utilisateur anonyme
       
      Re,
      normalement j'ai compris , sauf que j'ai essayé autre chose mais sa ne marche pas. j'ai essayé de garder que les chiffres avant le "-" et ignorer ceux d'apres le "-".

      01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 :304914211-20

      01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 :321149312-432
      comme ceci:
      01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 :304914211

      01 : 6407385 : ville de clamart,92140,clamart : fournitures : ouvert : 28/01/2008 : 92 :321149312
      ma formule je l'ai ecrite comme ceci:
      siham@megalink:~$ sed -r 's/(.*:)([^,]*),([^,]*),(-.*)?:/\1\3/' 2008.textV5|less

      je lui ai dit ignore tout ce qui vient apres le "-" mais sa marche pas .
      j'ai essayé avec siham@megalink:~$ sed -r 's/(.*:)([^,]*),([^,]*),(.*)(-.*)?:/\1\3/' 2008.textV5|less mais il m'a supprimé tout les champs et il a gardé que les champs où il ya des nombres!!!
      0
    4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      sed -r 's/(.*:)([^,]*),([^-]*)-(.*)/\1\3/'

      ;-))
      0
    5. Utilisateur anonyme
       
      et quand je fait sa:
      siham@megalink:~$ sed -r 's/[0-9]{9}(-.*)/\1:/' 2008.textV6|less
      il m'affiche le contraire , ce qui vient apres le "-"

      : -208
      01 : 6471404 : lycee louis thuilliergroupement de c,80098,amiens : fournitures : ouvert : 21/02/2008 : 80 : -16
      01 : 6471404 : lycee louis thuilliergroupement de c,80098,amiens : fournitures : ouvert : 21/02/2008 : 80 : -16:

      enfin bref, les tuto que j'ai trouvé ne sont pas trop détaillés.
      merci pour votre aide.
      0