IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Bash - Découper une chaine de caractères


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 48
    Points : 34
    Points
    34
    Par défaut Bash - Découper une chaine de caractères
    Bonjour,

    J'ai cherché sur le forum une façon de decouper une chaine de caractères comme je le voulais mais je n'ai pas trouvé mon bonheur.

    J'ai une valeur :
    CHAINE=2a,2b,2c,2d

    et je souhaieterais decouper ma valeur CHAINE avant la virgule afin d'utiliser chaque valeur dans une fonction :
    ex:

    POUR chaque morceau avant la virgule de la $CHAINE
    echo $morceau


    Merci de m'aider

    Merci beaucoup

  2. #2
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    etienne@info1:~ $ bla=2a,2b,2c,2d
    etienne@info1:~ $ echo $bla | cut -f1 -d,
    2a
    etienne@info1:~ $ echo $bla | cut -f2 -d,
    2b
    etienne@info1:~ $ echo $bla | cut -f3 -d,
    2c
    etienne@info1:~ $ echo $bla | cut -f4 -d,
    2d
    Je me doute que cette réponse n'est pas complète ... Puisque tu sembles vouloir faire ça dans une boucle.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    merci beacoup de cette reponse si vite
    mais faut le faire dans une boucle car je ne sais pa a l'avance combien de morceau j'ai dans ma chaine

  4. #4
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Citation Envoyé par nicolas.pissard
    merci beacoup de cette reponse si vite
    mais faut le faire dans une boucle car je ne sais pa a l'avance combien de morceau j'ai dans ma chaine
    Peut être que tu peux compter le nombre de virgules avant de lancer ta boucle ...

  5. #5
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Salut,

    Alors une solution rapide avec tr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $ toto=2a,gdfg,56464,fdmlg
    $ echo $toto
    2a,gdfg,56464,fdmlg
    $ for i in `echo $toto | tr "," " "`; do echo $i; done #ici la ligne qui t'interesse
    2a
    gdfg
    56464
    fdmlg
    ++
    Pouic

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    comment compter le nombre de virgules ? avec wc c'est ca ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    merci ca marche nickel
    merci beacoup a vous tous

  8. #8
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Citation Envoyé par nicolas.pissard
    merci ca marche nickel
    merci beacoup a vous tous
    Tu as compris sa méthode ?

    Pas très pédagogique de donner la solution sans le laisser chercher.

    D'autant plus que la solution donnée est plutôt maligne, mais pas super logique pour non initié.

  9. #9
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par ggnore
    Citation Envoyé par nicolas.pissard
    merci ca marche nickel
    merci beacoup a vous tous
    Tu as compris sa méthode ?

    Pas très pédagogique de donner la solution sans le laisser chercher.

    D'autant plus que la solution donnée est plutôt maligne, mais pas super logique pour non initié.
    Effectivement, mea culpa...
    Voici quelques explications :

    tr va transformer tous les caracteres "," qui arrivent sur son entree standard en espaces " ".
    J'envoie donc la variable a transformer sur l'entree de tr, et la sortie de tr est donc une chaine avec espaces.
    On peut donc boucler dessus à l'aide d'un for.
    Il ne reste plus qu'a afficher chaque element de la boucle, qui correspond a chaque "morceau" de la chaine initiale.

    Voilou !

  10. #10
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Citation Envoyé par Pouic
    Voilou !
    J'espère ne pas avoir trop joué le redresseur de tort ou le paladin débile.

    Quoi qu'il en soit, le posteur a l'air de s'être contenté du fait que ça marche.
    Bien trouvé Pouic, et bonne continuation.

  11. #11
    Membre régulier Avatar de ikeaboy
    Inscrit en
    Novembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 114
    Points : 109
    Points
    109
    Par défaut
    Merci pour ces explications.

    Pour ma part tout n'était pas totalement clair, mais ca m'a donné une bonne idée et une bonne piste pour chercher.

    J'ai eu plus d'info ici http://www.admin-linux.fr/?p=7085 au sujet de l'IFS.

    Si ca peut en aider d'autres

    Merci pour votre aide !

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 587
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 467
    Points
    19 467
    Par défaut
    tutoriel débile, comme on en voit trop sur le net, où il est montré qu'il faudrait modifier l'IFS pour parcourir correctement une substitution de commande avec une bocule for, quand ce type de traitement doit être confier à une boucle while dans laquelle on modifie l'IFS unqiuement dans l'environnement de la commande read.

    déterrer un si vieux sujet (2005 quand même !) pour ça, c'était pas la peine !

  13. #13
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 266
    Points : 13 529
    Points
    13 529
    Par défaut Droit au but
    Bonjour,

    quit à utiliser 'tr', autant directement remplacer par des retours à la ligne, plutôt que de faire des boucles compliquées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ tr "," "\n" <<<"2a,gdfg,56464,fdmlg"
    2a
    gdfg
    56464
    fdmlg

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 587
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 467
    Points
    19 467
    Par défaut
    moi, je sors même pas du shell :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IFS=',' read -a array <<<"2a,gdfg,56464,fdmlg" # ici, l'IFS n'est modifié que dans l'environnement du read.
    printf '%s\n' "${array[@]}"
    2a
    gdfg
    56464
    fdmlg
    et les parties de la chaîne sont accessibles via les index du "tableau".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [bash] Découper une chaine de caractères
    Par _PaTaTe_ dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 28/02/2015, 18h16
  2. Réponses: 8
    Dernier message: 22/02/2010, 09h35
  3. [SQ2K] Découper une chaine de caractères
    Par maitrebn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2007, 19h22
  4. Réponses: 6
    Dernier message: 15/04/2007, 13h06
  5. [VBA] Découper une chaine de caractères
    Par rantanplan81 dans le forum VBA Access
    Réponses: 3
    Dernier message: 12/04/2007, 15h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo