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 :

Tester tous les cas de présence ou non de 3 chaînes dans un fichier !


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Par défaut Tester tous les cas de présence ou non de 3 chaînes dans un fichier !
    Bonjour,

    Mon objectif est de faire des tests de contrôle sur 3 chaînes de caractères selon leur présence (ou non) dans un fichier, sans oublier aucun cas de figure possible! Pour chaque test, je dois afficher un message de succès ou d'échec sur l'écran, et l'écrire dans un fichier. Et pour me compliquer encore la vie, tous mes tests de contrôle doivent eux-mêmes se situer à l'intérieur d'une grande boucle if/then/else/fi...

    Ce que je sais faire « à peu près » : tester la présence ou non d'un seul pattern dans un fichier (merci de corriger si j'ai faux, car je suis encore sûr de rien, Bonjour à: Sve@r, N_BaH et zipe31 ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if grep "$EXP1" "myfile" > /dev/null 2>&1
                 then 
                          blah blah… 
                 else
                          blah blah ... 
                 fi
    Comment faire si je dois faire avec 2 autres patterns, et donc avec toutes les probabilités suivantes (EXP1, EXP2 et EXP3 sont des variables dans lesquelles, j'ai mis les chaînes recherchées.
    )

    1) Les 3 chaînes sont dans mon fichier.
    2) Les 3 chaines n'y sont pas.
    3) EXP1 seul y est, EXP2 et EXP3 n'y sont pas.
    4) EXP2 seul y est, EXP1 et EXP3 n'y sont pas.
    5) EXP3 seul y est, EXP1 et EXP2 n'y sont pas.
    6) EXP1 et EXP2 y sont, EXP3 n'y est pas
    7) EXP1 et EXP3 y sont, EXP2 n'y est pas
    8) EXP2 et EXP3 y sont, EXP1 n'y est pas

    Mes questions :
    1) Ai-je cité tous les cas de combinaisons possibles ?
    2) Comment couvrir tous les cas énumérés en utilisant peu de commandes ou en tout cas la méthode la plus élégante possible et surtout la plus courte (économe en nombre de if).

    Voici mon grand if dans lequel doivent se situer mes tests de contrôle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if [ -f myfile ] 
    then
             cp myfile myfile.old
     
              ===> ZONE DE CONTROLE DES CHAINES  ====
             sed -i.OLD -e "s/^$EXP1$/$DON/" -e "/^$EXP2$/d" -e "/^$EXP2$/d" "myfile"
    else
     
    echo "Le fichier myfile n'existe pas dans $HOME"
    fi
    D'avance Merci !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    Comment faire si je dois faire avec 2 autres patterns, et donc avec toutes les probabilités suivantes (EXP1, EXP2 et EXP3 sont des variables dans lesquelles, j'ai mis les chaînes recherchées
    tu itères les expressions recherchées dans une boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for expr in "$expr1" []
    do if grep "$expr" []
       then
    pour savoir quel cas correspond à une expression, tu utilises un flag qui sera incrémenté dans la boucle for (ici, sur 3 cas, ça va pas être trop compliqué) :
    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    si flag existe
    alors flag vaut flag +2
    autre flag vaut 1
    finsi
    si expr_N est_dans fichier #if grep
    alors match vaut match + flag
    finsi
    à peu près...
    si aucune expression ne correspond match reste à zéro.
    il y a d'autres possibilités pour définir flag, voire des manières de faire sans

    finalement, utilise un case sur chaque valeur possible de match

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

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Par défaut
    N_BaH, je suis désespéré, car je serais réellement incapable de programmer ce que tu viens de décrire
    Je ne pensais pas que c'était si difficile - enfin tel que je le vois actuellement en tout cas...

    Je pensais à un truc qui pourrait se résoudre en 1 ou 2 lignes (3 au maxi) commandes, avec par exemple un vieux egrep :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    egrep "$EXP1|$EXP2|$EXP3" "myfile"
    Et que toute la bataille va se jouer sur comment réduire les 8 possibilités que j'ai énumérées et dont certaines seraient logiquement inutiles voire erronées...
    Là, du coup, je ne sais pas trop quoi faire...

  4. #4
    Membre expérimenté
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Par défaut
    En faisant cela, tu aurais vu que tu peux définir plusieurs patterns de sélection en faisant cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -i 'PATTERN1|PATTERN2|PATTERN3' /my/file

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    je me suis peut-être pris les pieds dans le tapis...

    ôtes-moi un doute :
    quelle importance de savoir si les regexp correspondent dans le fichier ?
    faut-il les identifier pour accomplir des actions différentes selon le cas ?

    c'est ce que j'ai compris :
    faire des tests de contrôle sur 3 chaînes de caractères selon leur présence (ou non) dans un fichier, sans oublier aucun cas de figure possible! Pour chaque test, je dois afficher un message de succès ou d'échec sur l'écran, et l'écrire dans un fichier.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    je me suis peut-être pris les pieds dans le tapis...

    ôtes-moi un doute :
    quelle importance de savoir si les regexp correspondent dans le fichier ?
    faut-il les identifier pour accomplir des actions différentes selon le cas ?
    Les 3 regexp sont différentes, et à chaque fois que je trouve une (ou je ne la trouve pas) dans le fichier, je dois faire un traitement et/ou afficher un simple message sur l'écran et l'écrire dans un fichier.
    Si elles sont toutes dans le fichier, je sors de la boucle et passe à autre chose (l'étape suivante dans le script).
    Si aucune n'est dans le fichier, alors là, je fais plusieurs traitement des mv, des cp, etc.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Les 3 regexp sont différentes, et à chaque fois que je trouve une (ou je ne la trouve pas) dans le fichier, je dois faire un traitement et/ou afficher un simple message sur l'écran et l'écrire dans un fichier.
    ça demande quelques éclaircissements.

    le traitement est-il différent selon que c'est l'expression 1, ou la 2, ou la 3, qui est trouvée ?
    expr1 trouvée => traitement_1
    expr2 trouvée => traitement_2

    exprX et exprY trouvées => traitement_N
    ?

    sinon, effectivement, si le traitement ne dépend que de la présence d'une des expressions, alors if egrep "$EXP1|$EXP2|$EXP3" "myfile"; then devrait suffire.

    edit: ah mais là tu ne peux pas dire si elles y sont toutes; il faut donc les énumérer quand elles correspondent...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. $db->query ne marche pas dans tous les cas
    Par bigorre1000 dans le forum Zend_Db
    Réponses: 8
    Dernier message: 22/07/2008, 19h50
  2. Réponses: 1
    Dernier message: 17/03/2008, 20h29
  3. [CloseWindow] Quitte dans tous les cas
    Par michaeljeru dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 05/05/2007, 14h45
  4. Priorité aux familles dans tous les cas
    Par aline921 dans le forum Congés
    Réponses: 6
    Dernier message: 06/03/2007, 16h53
  5. Réponses: 23
    Dernier message: 11/04/2006, 17h33

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