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 :

Egrep et les crochets


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Par défaut Egrep et les crochets
    Salut,

    Dans un fichier, j'ai une série de ligne qui ressemble à ceci :

    date_et_heure ERROR [Motif_de_l_erreur_qui_est_inconnu.error] détail bref de ce qui s'est passé.
    J'aimerais récupérer pour la première ligne, le contenu entre crochets, je pensais à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    egrep -o egrep -o "[\[(a-zA-Z0-9){*}\]]"
    mais ça ne fonctionne pas. Le motif de l'erreur comprend des caractères comme '.', des majuscules, de minuscules et des chiffres.
    Quelqu'un voit l'erreur?

  2. #2
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Il me semble y avoir pas mal de problèmes dans ta regexp personnellement, je ne sais même pas dire exactement ce qu'elle pourrait reconnaître (mais sûrement pas ton erreur, c'est sur ) !

    1. elle est entourée de crochet [ ]. Dans une regexp, [abc] repère a OU b OU c
    2. (a-z) repère et mémorise le texte a-z. Si tu veux dire "n'importe quelle lettre de a à z", il faut utiliser [a-z]
    3. * signifie que le motif précédent est répété 0 ou plusieurs fois. Dans ton exemple, {* signifie zéro ou plusieurs accolades ouvrantes. Les accolades permettant d'indiquer un nombre minimum et maximum de répétition d'un motif, * est finalement équivalent à {0,}. En l'occurrence, c'est assez trompeur je trouve car tu n'as pas besoin d'échapper l'accolade pour que cela marche... enfin bref

    Essaye déjà en corrigeant ça mais pas la peine de trop te compliquer la vie : tu veux reconnaître tout ce qui se trouve entre crochet... donc repère tes crochets (avec \[ et \] comme tu l'as fait) et ajoute un motif pour le tout

  3. #3
    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
    Voici une commande qui marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F '[][]' '{print $2}' fichier_entree
    Explication:
    L'option -F donne le ou les caractères utilisés comme séparateurs de champs (expression régulière). Ici c'est ']' et '[' dans cet ordre pour éviter une mauvaise interprétation. Dans ce cas, le deuxième champ est celui qui doit être affiché.

  4. #4
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Le truc, c'est que s'il y a des lignes sans erreur, tu vas renvoyer des lignes vides. On peut ajouter un grep derrière pour éviter ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F '[][]' '{print $2}' fichier_a_tester | grep -v '^$'
    Sinon, grep est suffisant pour faire ça, mais sera plus lent que awk (comme quoi...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -o "\[.*\]" fichier_a_tester

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 156
    Par défaut
    J'aurais dans un premier temps utilisé :

    Cependant , si il y a deux parties entre crochet cela peut pauser problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo [a] [b] | grep -o "\[[^\]*\]"
    en revanche la méthode proposé avec awk fonctionne, il doit aussi être possible de supprimer les contour avec sed, mais cela est aussi plus compliqué.

    NB : Le ^ dans l'ensemble des caractères signifie tous sauf un ].

Discussions similaires

  1. Supprimer les crochets encadrant une variante
    Par volubil dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 24/01/2012, 07h36
  2. Raccourci plus faciles pour les crochets
    Par coyotte507 dans le forum Mac OS X
    Réponses: 1
    Dernier message: 02/08/2011, 19h32
  3. Liste d'arguments sans les crochets
    Par Spitfire 95 dans le forum Général Python
    Réponses: 7
    Dernier message: 22/03/2010, 20h46
  4. Eliminer les crochets sans split
    Par narmika dans le forum Langage
    Réponses: 8
    Dernier message: 02/10/2007, 12h13
  5. [WebMacro] Les crochets s'invitent!
    Par Twofy dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 04/08/2004, 13h22

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