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 :

Rechercher exactement un élément d'une liste


Sujet :

Shell et commandes GNU

  1. #1
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut Rechercher exactement un élément d'une liste
    Bonjour à vous !

    Je me posais une question, est-il possible de simplifier ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for x in "${liste[@]}"
    do
        [[ ${x} == Exit ]] && return
    done
    J'avais pensé à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -w "Exit" <<< "${liste[@]}" && return
    mais il suffirait qu'il y ait un élément de la liste qui commence par Exit pour que ça plante le truc.

    Avez vous une autre idée ?

    Merci.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ liste=( exit fin end fine send )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ grep -o "fin" <<<${liste[@]}
    fin
    fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep -ow "fin" <<<${liste[@]}
    fin

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Salut

    oui mais non :p
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste=( exit "fin du cours" end fine send )
    me renverra que c'est vrai alors que non :p

    j'ai pensé à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -w "Exit:)" <<< "${liste[@]/%/:)}" && return
    en toute logique seul un élément dont le texte est Exit devrait s’appeler Exit non ?

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par hizoka Voir le message
    oui mais non :p
    D'où l'intérêt de toujours être précis et pointu dans son énoncé

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Je pensais l'être en disant : mais il suffirait qu'il y ait un élément de la liste qui commence par Exit pour que ça plante le truc.

    mais ça ne l'était peut être pas :p

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par hizoka Voir le message
    Je pensais l'être en disant : mais il suffirait qu'il y ait un élément de la liste qui commence par Exit pour que ça plante le truc.

    mais ça ne l'était peut être pas :p
    Ben pas assez pour moi (mais j'avoue que des fois je suis long à la détente ).
    La preuve avec mon "fin" et "fine" qui étaient censés interpréter tes dires

    D'où la nécessité d'exemples bien précis afin de lever toutes ambiguïtés

  7. #7
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    On m'a gentiment proposé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "%s\n" "${liste[@]}" | grep '^Exit$' && return

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    j'avais vu quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    searchArray () { ar=( exit fin 'exit ing' fine send ); rgx="^$(IFS='|'; echo "${ar[*]}")$"; [[ $1 =~ $rgx ]] && printf '%s\n' "${BASH_REMATCH}"; }
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    Plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ liste=( Exit fin end fine send "Exit le return" "le return Exit" )
    $ grep '^ \{0,1\}Exit$' <<<"${liste[@]/%/$'\n'}"
    Exit
    $ liste=( fin end fine send "Exit le return" "le return Exit" )
    $ grep '^ \{0,1\}Exit$' <<<"${liste[@]/%/$'\n'}"
    $ grep 'Exit' <<<"${liste[@]/%/$'\n'}"
     Exit le return
     le return Exit

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    full bash vaincra !


    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    N_Bah, ta soluce est un peu compliquée
    je suis pour le full bash mais pas à ce point la :p

    disedorgue
    J'étais pas trop loin avec mon idée... mais pas suffisamment.
    à quoi correspond : \{0,1\} ?
    car :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    egrep "^Exit$" <<< "${liste[@]/%/$'\n'}"
    fonctionne aussi bien.

    En tout cas, merci à vous !

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    Non, cela fonctionne uniquement si c'est le premier mot du tableau, dans les autres cas la substitution laisse un espace en début de ligne d'où le ^ \{0,1\} que l'on peut en fait simplifier par ^ \?.
    Et on pourrait aussi se passer du grep en bash pur (à la N_BaH mais sans toucher à l'IFS) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[ "${liste[@]/%/$'\n'}" =~ $'\n'\ Exit$'\n' || "${liste[@]/%/$'\n'}" =~ ^Exit$'\n' ]] && echo ${BASH_REMATCH/*Exit*/Exit}

  13. #13
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    En effet tu as raison mon test était faussé.

    Merci beaucoup pour vos propositions, j'ai le choix

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

Discussions similaires

  1. Recherche d'un élément dans une liste
    Par Hyssgrif dans le forum Langage
    Réponses: 3
    Dernier message: 21/02/2016, 12h13
  2. Problème de recherche des éléments dans une liste.
    Par amine1980 dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 09/04/2011, 23h34
  3. Recherche dans les éléments d'une liste
    Par adelotti dans le forum VBA Word
    Réponses: 12
    Dernier message: 19/06/2008, 16h52
  4. Réponses: 2
    Dernier message: 22/04/2008, 16h21
  5. Recherche d'un élément dans une liste triée (vitesse)
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 18/05/2006, 09h23

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