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

Linux Discussion :

[grep] Une question sur les expressions régulières


Sujet :

Linux

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 46
    Points : 40
    Points
    40
    Par défaut [grep] Une question sur les expressions régulières
    Bonjour à toutes et à tous.

    J'ai un fichier liste monFichierListe constitué de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    monFichier.toto
    monFichier.toto.titi
    monFichier2.toto
    monFichier2.toto.titi
    Quand je fais un grep sur ce fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep .toto monFichierListe
    Il me récupère toutes les lignes. je me suis donc dit, passons aux expressions régulières :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -e .toto$ monFichierListe
    Mais cela ne me ramène plus rien.
    Quand je tente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -e ^monFichier. monFichierListe
    Là par contre, il me ramène bien les deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    monFichier.toto
    monFichier.toto.titi
    Enfin, si je modifie monFichierListe de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    monFichier.toto
       monFichier.toto.titi
    monFichier2.toto
    monFichier2.toto.titi
    Alors la commande suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -e ^monFichier. monFichierListe
    me ramène bien une seule ligne :
    Je ne comprends pas mon expression régulière sur le début de ligne passe et pas celle de fin de ligne ?

    J'ai aussi essayé grep avec l'option -P et j'ai le même résultat. Au niveau expression régulière, pourtant, c'est bien le symbol "$" la fin de ligne non ?

    Je me demandais donc si quelqu'un n'avais pas un petit tuyau ^_^ ?

    Cdt.

    Bahan

  2. #2
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    Pour que ça fonctionne, il te faut "échapper" le point :
    Sinon, le point est pris pour un caractère spécial.
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 46
    Points : 40
    Points
    40
    Par défaut
    Ok merci pour ta réponse.

    Cependant la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -P \.toto$ monFichierListe
    Ne ma ramène toujours rien.
    Il faut que je mette un point devant le $ pour que cela fonctionne, mais je ne comprends pas pourquoi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -P \.toto.$ monFichierListe
    Me ramène bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    monFichier.toto
    monFichier2.toto
    Cependant, je ne devrais pas avoir à mettre un . devant le $. Je veux dire, en perl, il faut mettre le caractère $ juste après le nom et ça marche x_x.

    J'ai regardé le man grep, et il dit bien que le caractère $ sert pour la fin de ligne. Alors, boudiou, pourquoi ai-je besoin de mettre un fucking . devant ?

    Edit : je suis trop naze !!!! J'ai oublié le caractere retour chariot . Pffff...

    Cdt.

    Bahan

  4. #4
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    1. Regarde le sens du point.
    2. Et sans le "$", ça donne quoi ?
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 46
    Points : 40
    Points
    40
    Par défaut
    Merci pour ton aide encore une fois.
    Il semblerait que j'ai mal compris le concept de ligne en oubliant qu'à la fin il peut ou pas y avoir un retour chariot.

    Du coup, je fais la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -P ^.*\.toto.?$ monFichierListe
    Et cela fonctionne bien ^_^.
    Et là je comprends mieux pourquoi j'avais faux avant.

    Par contre, quand j'ai une variable dans mon grep et que cette variable contient des caracteres du type ".", comment faire pour échapper ces caractères ?

    Comme exemple, prenons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sMonExtension=toto.titi
     
    grep -P ^.*\.${sMonExtension}.?$ monFichierListe
    Est-ce que le . contenu dans ma variable doit être échappé ? Si oui comment ?

    Cdt.

    Bahan

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Oui bien sûr, le point doit être échappé sinon il match n'importe quel caractère, pas seulement le point. Comment l'échapper si ton pattern est dans une variable ? Et bien tu ne peux pas, ou en tout cas pas de manière simple et sûre... Il faut que ta variable contiennent déjà un bon pattern, c'est à dire un backslash avant le point.

    Maintenant j'ai l'impression que ton truc n'est pas vraiment un pattern, mais que tu veux juste filtrer les lignes qui contiennent la chaine contenue dans ta variable. Si c'est le cas tu peux utiliser grep -F, qui ne prend pas une regexp mais un chaine fixe en paramètre.

Discussions similaires

  1. [RegEx] question sur les expressions régulières
    Par vasilov dans le forum Langage
    Réponses: 2
    Dernier message: 20/06/2008, 16h25
  2. question sur les expressions régulières
    Par goanes dans le forum Langage
    Réponses: 2
    Dernier message: 02/09/2007, 23h34
  3. Question sur les expressions régulières
    Par zarbiman dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 03/04/2007, 14h27
  4. Question sur les expressions régulières
    Par espadon1 dans le forum Langage
    Réponses: 2
    Dernier message: 05/07/2006, 08h59
  5. une question sur les includes comportement bizard
    Par e-m.guillaume dans le forum Langage
    Réponses: 2
    Dernier message: 24/02/2006, 21h12

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