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

  1. #1
    Membre du Club
    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
    Points : 63
    Points
    63
    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 588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 472
    Points
    19 472
    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

    ?

  3. #3
    Membre du Club
    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
    Points : 63
    Points
    63
    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 averti
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Points : 304
    Points
    304
    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 588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 472
    Points
    19 472
    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.

  6. #6
    Membre du Club
    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
    Points : 63
    Points
    63
    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 588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 472
    Points
    19 472
    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...

  8. #8
    Membre du Club
    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
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ç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...
    Non, le traitement est le même selon que :

    exp1 trouvée => traitement_1&2...N
    exp2 trouvée => traitement_1&2...N

    expX et expY trouvées => traitement_1&2...N

    Maintenant, d'un autre côté :
    exp1 ET exp2 ET exp3...ET expN non-trouvées => traitement_particulier

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 472
    Points
    19 472
    Par défaut
    tu n'as donc que trois cas a considérer (en fait deux) :
    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cas $nbDoccurrences vaut
    0) traitement : mv; cp
    1 ou 2) traitement1&2
    3) : #rien à faire
    fincas
    (on peut faire ça avec des évaluations arithmétiques)
    par contre, il faut d'abord énumérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for expr in "$expr1" [...]
    do if grep "$expr" [...] ; then nbDoccurrences=$(( $nbDoccurrences + 1 )); fi
    done

  10. #10
    Membre du Club
    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
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    tu n'as donc que trois cas a considérer (en fait deux) :
    [code=pseudo-code]cas $nbDoccurrences vaut
    0) traitement : mv; cp
    1 ou 2) traitement1&2
    3) : #rien à faire
    Je serais plutôt du côté du "case", mais quand je ferrai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case     $nbDoccurrences in
     
    0) traitement : mv, cp
    Qu'est-ce que je mets au juste à la place de $nbDoccurrences ?
    Et puis comment écrire exactement le "1 ou 2)", remplacer le "ou" par un "OR" ou un "|" ou bien le laisser tout simplement tel qu'il est ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 472
    Points
    19 472
    Par défaut
    Qu'est-ce que je mets au juste à la place de $nbDoccurrences ?
    tu le laisses ainsi (enfin, tu lui donnes le nom que tu veux, pourvu que le nom rende compte de sa fonction dans le script), sauf que l'incrémentation dans la boucle for ne fera jamais que nbDoccurrences vaille 0 :
    s'il n'y a pas d'occurrence, nbDoccurrences n'aura pas de valeur, donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case $nbDoccurrences in
    '') traitement mv cp
    ;;
    1|2) traitement_1&2
    ;;
    esac
    ou alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case $((nbDoccurrences)) in
    0) traitement mv cp
    ;;
    1|2) traitement_1&2
    ;;
    esac
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ((! nbDocccurrences))
    then : #traitement mv cp
    elif (( nbDocccurrences < 3 ))
    then : #traitement_1&2
    fi
    ±

  12. #12
    Membre du Club
    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
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    tu le laisses ainsi (enfin, tu lui donnes le nom que tu veux, pourvu que le nom rende compte de sa fonction dans le script), sauf que l'incrémentation dans la boucle for ne fera jamais que nbDoccurrences vaille 0 :
    s'il n'y a pas d'occurrence, nbDoccurrences n'aura pas de valeur, donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case $nbDoccurrences in
    '') traitement mv cp
    ;;
    1|2) traitement_1&2
    ;;
    esac
    ou alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case $((nbDoccurrences)) in
    0) traitement mv cp
    ;;
    1|2) traitement_1&2
    ;;
    esac
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (( nbDocccurrences && nbDocccurrences < 3 ))
    then : #traitement_1&2
    elif ((! var))
    then : #traitement mv cp
    fi
    ±
    Intéréssant tout ça, mais si je me penche sur la 2ème ou la 3ème solution, est-ce que le $(()) ou le (()) tou court sont supportés par Solaris (avec un #!/bin/sh) ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 472
    Points
    19 472
    Par défaut
    probablement pas, ça ne fonctionne déjà pas avec ash...
    par contre, la troisième, que j'ai simplifiée dans mon précédent post) est facilement transposable entre crochets simples.

  14. #14
    Membre du Club
    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
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    tu le laisses ainsi (enfin, tu lui donnes le nom que tu veux, pourvu que le nom rende compte de sa fonction dans le script), sauf que l'incrémentation dans la boucle for ne fera jamais que nbDoccurrences vaille 0 :
    s'il n'y a pas d'occurrence, nbDoccurrences n'aura pas de valeur
    Je reviens juste sur ce point, car il y a quelque chose qui m'échappe : de quelle boucle "for" tu parles ?
    Quand je te demandais quoi mettre à la place du nbDoccurrences, je voudrais dire qui lui donnera ses valeur 0, 1|2 et 3) ? Comme on est dans un case, ces valeurs doivent-être connues à l'avance, mais ici je ne vois pas par quel moyen, à moins.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 472
    Points
    19 472
    Par défaut
    il faut d'abord énumérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for expr in "$expr1" [...]
    do if grep "$expr" [...] ; then nbDoccurrences=$(( $nbDoccurrences + 1 )); fi
    done

  16. #16
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bras39 Voir le message
    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 ?
    Salut

    Tu as dû faire des maths dans ta vie. Combien de cas possibles pour 3 éléments dont chacun peut prendre deux valeurs distinctes ? Réponse: 2^3

    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    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
    Amusant mais pourquoi utiliser 2 flags et un match ??? Pourquoi ne pas faire une analogie avec les droits Unix rwx ???
    Associer elem1 à 4, elem2 à 2 et elem3 à 1
    Si elemX est présent alors ajouter sa valeur à flag
    Au final, si flag vaut
    • 0 => rien

    • 1 => elem3

    • 2 => elem2

    • 3 => elem2 et elem3

    • 4 => elem1

    • 5 => elem1 et elem3

    • 6 => elem1 et elem2

    • 7 => elem1 et elem2 et elem3

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 588
    Points : 19 472
    Points
    19 472
    Par défaut
    Bonjour Sve@r,

    Associer elem1 à 4, elem2 à 2 et elem3 à 1
    Je ne vois pas comment faire en étant strictement PSIX

  18. #18
    Membre du Club
    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
    Points : 63
    Points
    63
    Par défaut
    Bonjour N_BaH,

    Je suis désolé, je n'arrive pas lorsque tu me me dis :

    il faut d'abord énumérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for expr in "$expr1" [...]
    do if grep "$expr" [...] ; then nbDoccurrences=$(( $nbDoccurrences + 1 )); fi
    done
    Dans ton code ci-dessus, où je dois placer les différents "case" ? En fait, je ne vois pas trop ce que je dois mettre dans tes différents "[....]" ci-dessus et surtout où et comment marier/harmoniser ton code avec le mien que voici :

    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

  19. #19
    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,

    En espérant avoir tout compris...

    Un petit exemple basé sur le nombre d'occurrences différentes rencontrées dans les différentes fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    $ ls -1 fi*
    fich      # Ne contient aucun des motifs recherchés
    fich1     # Contient un seul motif recherché en plusieurs exemplaires
    fich2     # Contient deux motifs recherchés en plusieurs exemplaires
    fich3     # Contient les trois motifs recherchés en plusieurs exemplaires
     
    $ cat foo.sh 
    #! /bin/bash
     
    for i in fich*
    do
       nbr=$(grep -Eo 'A|W|Z' $i  | sort -u | wc -l)
     
       case "$nbr" in
    	0)	echo "Fichier $i ne contient aucune occurrence";;
    	1|2)	echo "Fichier $i contient une ou deux occurrence(s) différente(s)";;
    	3)	echo "Fichier $i contient trois occurrences différentes";;
    	*)	echo "Erreur";;
       esac
    done
     
    $ ./foo.sh 
    Fichier fich ne contient aucune occurrence
    Fichier fich1 contient une ou deux occurrence(s) différente(s)
    Fichier fich2 contient une ou deux occurrence(s) différente(s)
    Fichier fich3 contient trois occurrences différentes
     
    $

  20. #20
    Membre du Club
    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
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    En espérant avoir tout compris...

    Un petit exemple basé sur le nombre d'occurrences différentes rencontrées dans les différentes fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    $ ls -1 fi*
    fich      # Ne contient aucun des motifs recherchés
    fich1     # Contient un seul motif recherché en plusieurs exemplaires
    fich2     # Contient deux motifs recherchés en plusieurs exemplaires
    fich3     # Contient les trois motifs recherchés en plusieurs exemplaires
     
    $ cat foo.sh 
    #! /bin/bash
     
    for i in fich*
    do
       nbr=$(grep -Eo 'A|W|Z' $i  | sort -u | wc -l)
     
       case "$nbr" in
    	0)	echo "Fichier $i ne contient aucune occurrence";;
    	1|2)	echo "Fichier $i contient une ou deux occurrence(s) différente(s)";;
    	3)	echo "Fichier $i contient trois occurrences différentes";;
    	*)	echo "Erreur";;
       esac
    done
     
    $ ./foo.sh 
    Fichier fich ne contient aucune occurrence
    Fichier fich1 contient une ou deux occurrence(s) différente(s)
    Fichier fich2 contient une ou deux occurrence(s) différente(s)
    Fichier fich3 contient trois occurrences différentes
     
    $
    Bonjour zipe31,

    Juste une petite précision : Je n'ai pas plusieurs fichier fich* dans lesquels je cherche des regexp. J'ai un seul fichier "myfile" qui contient 3 chaînes dont je cherche les occurrences. Et selon qu'elles existent ou non dans mon fichier, je dois faire des actions : des mv, des cp, de simples affichages sur l'écran et dans un fichiers, sortir sans rien faire, etc...

    Par ailleurs, je ne vois toujours pas comment marier vos code avec le mien qui est ici (où je commence d'abord par tester si mon fichier "myfile" lui même existe, j'aimerai donc voir comment vous intégrez vos code au mien ) :

    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
    Les expressions à rechercher dans mon fichier "myfile" sont stockées dans les 3 variables : EXP1, EXP2, EXP3.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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