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 confirmé
    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
    Points : 460
    Points
    460
    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.
    Sous Kubuntu 20.04

  2. #2
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    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
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  3. #3
    Membre confirmé
    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
    Points : 460
    Points
    460
    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 ?
    Sous Kubuntu 20.04

  4. #4
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    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é
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  5. #5
    Membre confirmé
    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
    Points : 460
    Points
    460
    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
    Sous Kubuntu 20.04

  6. #6
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    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
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  7. #7
    Membre confirmé
    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
    Points : 460
    Points
    460
    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
    Sous Kubuntu 20.04

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    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 éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    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
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    full bash vaincra !


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

  11. #11
    Membre confirmé
    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
    Points : 460
    Points
    460
    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 !
    Sous Kubuntu 20.04

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    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}
    Cordialement.

  13. #13
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    En effet tu as raison mon test était faussé.

    Merci beaucoup pour vos propositions, j'ai le choix
    Sous Kubuntu 20.04

+ 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, 13h13
  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: 10/04/2011, 00h34
  3. Recherche dans les éléments d'une liste
    Par adelotti dans le forum VBA Word
    Réponses: 12
    Dernier message: 19/06/2008, 17h52
  4. Réponses: 2
    Dernier message: 22/04/2008, 17h21
  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, 10h23

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