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 :

A propos de la commande grep


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 9
    Localisation : Autre

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 46
    Par défaut A propos de la commande grep
    Bonjour tout le monde,

    j'enseigne le français et j'ai besoin de fournir plusieurs exemples illustrant des combinaisons des lettres. Pour ça je lance la commande suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -o [a-Z]*ai[a-z]*$ Madame\ Bovary.txt | tr -s '\n' ','
    cette commande renvoie les champs contenant la combinaison des lettres ai.

    J'ai deux questions:
    1. Comment faire pour éviter la répétition des mêmes mots
    2. Que faire pour que les virgules soient suivies d'espaces?

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Il y a sûrement plus élégant mais voici une suggestion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -o '[a-Z]*ai[a-z]*$' Madame\ Bovary.txt | sort -u | while read n; do printf "%s, " "$n"; done | sed 's/..$/\n/'
    J'ai mis le motif de recherche entre simples quotes pour éviter les surprises
    Le sort -u sert à supprimer les doublons
    La boucle while remplace chaque fin de lignes par "virgule+espace"
    Le sed final remplace la dernière virgule par un saut de ligne.

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

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

    1. Comment faire pour éviter la répétition des mêmes mots
    2. Que faire pour que les virgules soient suivies d'espaces?
    ne pas utiliser grep | tr, pratique, mais inapproprié dans ce cas particulier, et utiliser sed.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    1. Comment faire pour éviter la répétition des mêmes mots
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -o '[a-Z]*ai[a-z]*$' Madame\ Bovary.txt | sort -u | tr -s '\n' ','
    2. Que faire pour que les virgules soient suivies d'espaces ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -o '[a-Z]*ai[a-z]*$' Madame\ Bovary.txt | sort -u |sed ':z;N;$!b z;s/\n/, /g'

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    ah, oui j'ai zappé l'indipensable sort, qui ne permet pas de n'utiliser qu'un seul sed.

    mais je ne suis pas convaincu par la regex; surtout le $ qui indique que le mot retourné sera en fin de ligne. ça ne posait pas de problème quand l'expression n'était pas "quotée", car le symbole était ignoré.
    il me semble que l'expression devrait être entre \< et />, pour indiquer le début et la fin d'un mot, non ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 9
    Localisation : Autre

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 46
    Par défaut
    Merci beaucoup mes amis!

    Vous avez résolu ma tâche.

    Pour le moment j'ai des questions sur ces commandes que vous avez utilisées, mais je vous les poserai après avoir consulté les man-pages convenables(si vous n'avez rien de contre biensûr).

    En attendant je note la conversation comme résolue.

    Merci beaucoup!

  7. #7
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    mais je ne suis pas convaincu par la regex; surtout le $ qui indique que le mot retourné sera en fin de ligne. ça ne posait pas de problème quand l'expression n'était pas "quotée", car le symbole était ignoré.
    Très juste. Le "$" réduit fortement le nombre de mots trouvés.
    il me semble que l'expression devrait être entre \< et />, pour indiquer le début et la fin d'un mot, non ?
    Pas sûr que ça simplifie la recherche, en revanche, les mots composés ou contenant une apostrophe ne sont pas retournés dans leur intégralité avec [A-z]*ai[a-z]*, on loupe aussi les mots tout en majuscule.

  8. #8
    Expert confirmé

    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
    Par défaut
    Salut,
    Citation Envoyé par jlliagre Voir le message
    Très juste. Le "$" réduit fortement le nombre de mots trouvés.

    Pas sûr que ça simplifie la recherche, en revanche, les mots composés ou contenant une apostrophe ne sont pas retournés dans leur intégralité avec [A-z]*ai[a-z]*, on loupe aussi les mots tout en majuscule.
    À tester…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "${A}"
    Qu'ai-je dit ou fait ? Aucune raison pour qu'une combinaison, de travail ou pas, se retrouve là de ce fait. Mais je braille, je braille, faut que j'aille bosser maintenant… ou jamais. Blaise, celui qui biaise.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo ${A} | grep -io "[a-z'-]*ai[a-z-]*" | sort -u | sed ':z;N;s/\n/, /;tz'
    biaise, Blaise, braille, combinaison, fait, j'aille, jamais, maintenant, Mais, Qu'ai-je, raison, travail

  9. #9
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2016
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 9
    Localisation : Autre

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2016
    Messages : 46
    Par défaut
    Tout d'abord la commande marchait sans "$", mais puis(je sais pas pourquoi) elle renonça. Enfin j'ai mis un"$" et la commande marcha de nouveau.
    Maintenant, comment devrais-je indiquer pour que j'obtiens les mots contenant les chaînes "aill"(par ex. volaille)?

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

Discussions similaires

  1. Aide sur la commande GREP
    Par roadruner dans le forum Linux
    Réponses: 6
    Dernier message: 30/07/2007, 19h43
  2. utiliser commande grep
    Par salim81 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 01/07/2007, 21h52
  3. Le temps que la commande "grep" en shell prend
    Par Pauli dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 25/12/2006, 19h59
  4. Commande Grep
    Par zalett dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 20/03/2006, 23h29
  5. [Réseau] A propos de la commande « Net Send »
    Par Furius dans le forum Administration
    Réponses: 23
    Dernier message: 06/10/2005, 13h12

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