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 :

Grep / Expression rationnelles


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Par défaut Grep / Expression rationnelles
    Bonjour,

    Petite incompréhension... j'espère que quelqu'un pourra m'éclairer, parce que la je sèche

    J'ai un fichier contenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    333
    4444zerfrg
    azerty111
    J'aimerais afficher à l'aide d'une commande grep, uniquement les lignes contenant une suite de 3 chiffres.

    J'ai d'abord commencer avec cette commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -E '[0-9]{3}' monfichier
    qui me renvoie le contenue entier de mon fichier.

    Il me semblait pourtant que le fait de mettre le quantifieur {n} indique que je veut exactement n fois quelque chose et pas plus.

    J'ai donc par la suite essayé de rajouter des contraintes mais sans grand succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    grep -E '[^0-9]*[0-9]{3}[^0-9]*' monfichier
    grep -E '[0-9]{3}[a-z]*' monfichier
    J'ai l'impression d'avoir loupé quelque chose.... c'est frustrant

    Merci d'avance pour votre aide.

  2. #2
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    Il ne s'agit pas simplement de demander: "afficher toutes les lignes contenant 3 chiffres", mais "afficher toutes les lignes ne contenant que trois chiffres". C'est-à-dire commençant par un chiffre et terminant par un chiffre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -E "^[0-9]{3}$" fichier

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Par défaut
    merci pour la réponse...

    J'ai peut être mal posé mon problème, ce que je voudrais c'est afficher toutes les lignes contenant une suite de 3 chiffres.

    donc les lignes :

  4. #4
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Le problème est effectivement différent. La contrainte devient donc: "toutes les lines contenant zéro ou plus caractère(s) non-numérique(s), puis trois chiffres, puis zéro ou plus caractère(s) non-numérique(s)". Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -E "^[^0-9]*[0-9]{3}[0-9]*$" fichier

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Par défaut
    Super merci beaucoup !!!!!

    Si je peut abuser de votre temps, je ne comprend pas pourquoi cette formule nécessite de marquer le début ^ et la fin $ de la chaîne ???

  6. #6
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Il est important de comprendre afin d'éviter de reposer la même question plus tard, non?

    C'est une question de logique: Entre le début de ligne et le premier chiffre du nombre à trois chiffres, il ne doit y avoir aucun chiffre (désolé pour les répétitions). Donc, si l'on ne met pas "^" au début, l'interpréteur cherchera une suite (entre 0 et n) de caractères non-numériques à partir de n'importe où, et par exemple juste après un chiffre parasite. Idem pour les caractères après le nombre à trois chiffres.

    J'espère que c'est clair...

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

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

    ...cependant, 22abc333acb1 n'est pas reconnue comme une correspondance valide, alors qu'elle le devrait, selon les critères de maksw (toutes les lignes contenant une suite de 3 chiffres), non?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Je ne l'ai pas compris de la sorte, c'est à maksw à dire ce qu'il veut plus exactement...

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Par défaut
    Je n'ai pas de requête précise, tous ceci est dans un but d'apprentissage des expressions régulières.
    Le commentaire de N_BaH est néanmoins pertinent, je vais essayer d'écrire une commande qui pourra aussi satisfaire ces critères (c'est un bon exercice... )

    Merci à jmelyn pour ces explications et à N_BaH pour ces remarques.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Par défaut
    Pour clôturer ce topic voici la requête que j'ai trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    grep -E "(^[^0-9]*|[^0-9])[0-9]{3}([^0-9]|[^0-9]*$)" monfichier

  11. #11
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Il serait bon d'écrire ce que tu veux en français. S'il s'agit de ceci: "au moins un caractère non-numérique, puis trois chiffres, puis au moins un caractère non numérique", alors l'ERE est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^[^0-9][^0-9]*[0-9]{3}[^0-9][^0-9]*$

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Par défaut
    Alors dans ce cas ce serait plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (de 0 à x caractère non-numérique en début de chaîne OU 1 caractère non-numérique), 
    puis trois chiffres,
    (puis 1 caractère non-numérique OU de 0 à x caractère non-numérique en fin de chaîne)

  13. #13
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    C'est une règle très étrange:

    Première partie:
    0 à n caractères non-numériques commençant en début de ligne
    sinon (il y a des caractères numériques)
    au moins 1 caractère non-numérique quelque part (mélangé à d'autres possiblement numériques, et pas obligatoirement en début de ligne)

    Deuxième partie:
    3 caractères numériques (au moins)

    Troisième partie:
    1 caractère non-numérique quelque part
    sinon (il n'y a encore que un ou des chiffres)
    0 à n caractères non-numériques (???)

    Des exemples qui passent:
    a111a
    1a111a
    11a11111a111a

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Par défaut
    Bonjour,

    Des exemples qui passent:
    a111a
    1a111a
    11a11111a111a
    Oui... suite à la remarque de N_BaH c'est justement ce que j'ai voulu faire :
    Afficher toutes les lignes à partir du moment ou elles contiennent une suite de 3 chiffres successifs et non pas afficher toutes les lignes contenant uniquement 3 chiffres successifs.

    Bon je reconnais que c'est un peux tordu et que M.H. Bergson à définitivement bien raison.

    En ce qui concerne ma règle j'aimerai juste apporter une précision, a moins que je ne me trompe mais quand vous dite "...au moins 1 caractère non-numérique quelque part..." moi je le vois plus comme ...au moins 1 caractère non-numérique juste après ou avant mes 3 chiffres. ( Est-ce une erreur de ma part de le voir de manière aussi restrictive ???)

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Par défaut
    Bonjour,

    Je reviens sur ce sujet puiqu'il s'agissait d'un exercice et pour confirmer la citation de Bergson.
    On peut formuler la question comme suit:
    Selectionner les lignes qui contiennent au moins un MOT de 3 chiffres.
    et le probleme est résolu.

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Par défaut
    zut, j'ai pas trouvé comment éditer un post, j'aurais eu l'air moins bête.

    alors on va remplacer mot par "séquence isolé" houps...

  17. #17
    Membre éprouvé Avatar de exodev
    Inscrit en
    Septembre 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2009
    Messages : 201
    Par défaut
    quelque chose de ce genre donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -E "^(.*[^0-9]+|[^0-9]?)[0-9]{3}([^0-9]?|[^0-9]+.*)$"

  18. #18
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Par défaut
    Le plus simple ça m'a l'air d'être ça :

    grep -E '^.*[^0-9][0-9]{3}[^0-9].*$'

  19. #19
    Membre éprouvé Avatar de exodev
    Inscrit en
    Septembre 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2009
    Messages : 201
    Par défaut
    et dans le cas de '111' ?

  20. #20
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Par défaut
    effectivement...je reconnais...

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

Discussions similaires

  1. [RegEx] Expression rationnelle
    Par Shadow aok dans le forum Langage
    Réponses: 15
    Dernier message: 28/12/2005, 17h29
  2. Non ambiguïté d'expressions rationnelles
    Par David.Schris dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 27/12/2005, 16h11
  3. [RegEx] Images et expression rationnelle
    Par Invité dans le forum Langage
    Réponses: 7
    Dernier message: 30/10/2005, 15h50
  4. Réponses: 2
    Dernier message: 21/02/2005, 10h42
  5. [langage] Expressions rationnelles (perl/C)
    Par ma2th dans le forum Langage
    Réponses: 11
    Dernier message: 02/08/2004, 18h07

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