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

  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 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    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 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    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 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    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)?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    il nous faudrait un échantillon du fichier en entrée, et de la sortie correspondante attendue en sortie.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par Dr. Watson Voir le message
    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)?
    Élémentaire, mon cher Watson!

    Il suffit de remplacer "ai" par "aill" dans la regexp, tout simplement!

  12. #12
    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 à tous!

    Quant au fichier, j'utilise celui-ci: http://www.gutenberg.org/files/14155/14155-8.txt

  13. #13
    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
    Citation Envoyé par Dr. Watson Voir le message
    Merci beaucoup à tous!

    Quant au fichier, j'utilise celui-ci: http://www.gutenberg.org/files/14155/14155-8.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep -io "[a-z'-]*aill[a-z-]*" pg14155.txt | sort -u | sed ':z;N;s/\n/, /;tz'
    aille, ailleurs, assaillie, basse-taille, bataille, bataillon, braillaient, braillant, braille, broussailles, cailles, caillou, cailloux, d'ailleurs, D'ailleurs, d'écaille, d'écailles, défaillances, défaillant, défaillante, défaillir, détaillée, écailles, écaillures, entrailles, éraillées, éraillés, faille, failli, faillirent, faillit, ferraille, ferrailles, fiançailles, futaille, gaillard, Gaillard-bois, gaillardes, gaillardises, gaillard-là, gaillards, godaillaient, haillons, infaillible, j'aille, jaillir, jaillissait, jaillit, l'infaillible, mailles, maillet, mangeaille, médaille, médailles, médaillon, muraille, murailles, paillasson, paille, pailles, paillettes, piaillarde, qu'ailleurs, quincaillerie, quincaillier, railleur, rejaillir, rejaillissait, ripailles, saillie, saillies, saillir, saillissaient, saillissait, s'écaillait, s'écaillant, semailles, tailla, taillait, taille, taillées, tailler, taillés, tailleurs, tiraillements, travaillait, travaillant, travaillé, travaillent, travailler, travailleuse, tressaillait, tressaillant, tressaillit, trouvaille, volaille, volailles

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Maintenant, comment devrais-je indiquer pour que j'obtiens les mots contenant les chaînes "aill"(par ex. volaille)?
    Maintenant, comment devrais-je indiquer pour que j'obtienne les mots contenant les chaînes "aill"(par ex. volaille)?

    Maintenant, si même ceux qui font étudier Madame Bovary maltraite le subjonctif, je rends mon tablier.
    Je comprends bien que c'est à la mode. Mais c'est incorrect et agressant quand même.

    Un tiret n'est pas un séparateur de mots. L'apostrophe, si.
    Il faut donc enlever l'apostrophe et mettre au début le tiret pour qu'il ne soit pas confondu avec une étendue.

  15. #15
    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 Flodelarab Voir le message
    Maintenant, si même ceux qui font étudier Madame Bovary maltraite le subjonctif, je rends mon tablier.
    Je ne sais par pourquoi, mais chaque fois que dans un forum, quelqu'un commente défavorablement l'orthographe ou la grammaire d'un post, il ne peut pas s'empêcher de faire lui même au moins une grosse faute, ici un singulier au lieu d'un pluriel: maltraitent le subjonctif

    Un tiret n'est pas un séparateur de mots. L'apostrophe, si.
    Pas forcément, par exemple:
    • aujourd'hui
    • d'abord
    • dos-d'âne
    • entr'acte
    • hors-d'œuvre
    • m'as-tu-vu
    • presqu'île
    • prud'homme
    • trompe-l'oeil
    • tout-à-l'égout

  16. #16
    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 mes amis pour vos réponses.

    Etant concentré sur le sujet informatique j'ai fait l'erreur grammaticale et c'est pas pour agresser la langue(que j'aime beaucoup). Je me sentirais assez gêné si mes postes devenaient le sujet des remarques amères(je vous comprends en tant que Mon Ami, aussi bien que moi, nous apprécions bien la pureté de notre langue maternelle).

    Merci encore de vos réponses et je vous assure de mes dispositions les plus positives.

+ 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