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 :

Assignation de variables à partir d'une chaine de caractères


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 11
    Points
    11
    Par défaut Assignation de variables à partir d'une chaine de caractères
    Bonjour, bonjour,

    Dur, dur d'être débutant.

    J'ai une ligne de forme suivante :

    AAAAAA BBBBBB CCCCCCCCCCCCCC DDDDDDDDD
    Tous mes champs sont donc séparés par un espace.

    J'aimerais que ce qui se trouve avant le premier espace soit mis dans une première variable, que ce qui se trouve entre les deux premiers espaces soit mis dans une autre, ...

    Pour être plus concret, le résultat final devrait être :
    var1 = AAAAAA
    var2 = BBBBBB
    var3 = CCCCCCCCCCCCCC
    var4 = DDDDDDDDD

    Complexité supplémentaire :
    - la taille de ces "sous-chaînes" est variable
    (et peut contenir des caractères de type virgule, point-virgule)
    - je suis obligé de passer par un "for" => pas de while read
    - j'aimerais qqch d'assez léger.
    ( J'utilise awk mais read ou cut pourrait-il m'aider ? )

    J'ai ceci pour le moment :

    for line in $lineList; do

    VAR1=$(echo $line | awk -F' ' '{print $1}')
    VAR2=$(echo $line | awk -F' ' '{print $2}')
    VAR3=$(echo $line | awk -F' ' '{print $3}')

    done
    Un tout grand merci pour vos conseils avisés.

    Nb: Je travaille avec ksh.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Effectivement, tu fais bien de préciser que tu travailles sous ksh (que je ne connais pas) !

    Dans l'immédiat, pour bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ligne="AAAA BBBB CCCC DDDD EEEE"
    read var{1..4} <<<$ligne
    echo $var2
    BBBB
    echo $var4
    DDDD EEEE
    Est-ce adaptable à ksh?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Il y a plusieurs solutions en ksh, mais à mon avis le plus simple est d'utiliser un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var=( $line )
    echo ${var[0]}
    echo ${var[1]}

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par matafan Voir le message
    Il y a plusieurs solutions en ksh, mais à mon avis le plus simple est d'utiliser un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var=( $line )
    echo ${var[0]}
    echo ${var[1]}

    C'est la plus simple mais à vrai dire c'est surtout la BONNE façon de faire pour les raisons suivantes : fiable, rapide, lisible, propre & élégante ....

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Un tout grand merci à vous tous.

    Je n'y avais pas pensé du tout. J'essaie cela demain.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Encore merci pour vos réponses. Je n'y arrivais malheureusement pas avec la forme en tableau. J'ai finalement remplacé les espaces par des tirets pour obtenir dans "$line" une ligne de mon fichier plat pour ensuite faire ceci :

    var=$(echo "$line" | sed -e "s/-/ /g")
    echo "$var" | read -r var1 var2 var3 reste
    Et cela marche.

    Bonne journée.

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Attention, le coup du read ne marche qu'avec certains shells et n'est pas portable. Le problème c'est qu'avec la pluspart des shells, la partie droite du pipe est exécutée dans un sous-process, et qu'une fois que le sous-process termine (c'est à dire une fois le read fini), les variables n'existent pas dans le process père. En fait je ne sais pas trop pourquoi ça marche en ksh. Je suppose que ksh a un mécanisme spécial pour traiter ce genre de cas.

Discussions similaires

  1. [Débutant] appeler une variable à partir d'une chaine de caractères
    Par caoutchouc159 dans le forum MATLAB
    Réponses: 3
    Dernier message: 06/04/2012, 11h56
  2. Réponses: 4
    Dernier message: 26/12/2011, 22h38
  3. Réponses: 2
    Dernier message: 29/01/2009, 18h59
  4. Réponses: 2
    Dernier message: 20/07/2007, 16h17
  5. Réponses: 7
    Dernier message: 15/11/2005, 10h14

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