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 pour un seul nombre


Sujet :

Shell et commandes GNU

  1. #21
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    Hum est-ce que tu pourrais expliquer etape par etape ton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '^31$\|^31\s\+\|\s\+31$\|\s\+31\s\+'
    S'il te plait.

    Oui Flodelarab pour cela je le savais deja a l'epoque c'est juste que j'avais esperer avoir un fichier un peu moins grand pour pouvoir si besoin faire la recherche "a l'oeil"

  2. #22
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ou '\<31\>', simplement, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo '31.' | grep '\<31\>'
    31.
    Citation Envoyé par Gagzkul Voir le message
    Hum est-ce que tu pourrais expliquer etape par etape ton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '^31$\|^31\s\+\|\s\+31$\|\s\+31\s\+'
    S'il te plait.
    ^31$ : ligne qui commence ET fini par 31
    ^31\s\+ : ligne qui commence par '31' et est suivi d'au moins un caractère de type espace.
    \s\+31$ : ligne qui fini par au moins un caractère de type espace suivi de '31'.
    \s\+31\s\+ : ligne avec '31' entouré d'au moins un espace de chaque coté.
    le \| : est le ou logique.
    ce qui me fait dire qu'en fait on peut simplifier en retirant le quantifieur '\+' puisqu' un seul espace (ou l'on en detecte plusieurs) valide déjà les cas.
    donc, la regex simplifiée : '^31$\|^31\s\|\s31$\|\s31\s' devrait aussi le faire.
    Cordialement.

  3. #23
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    D'accord merci beaucoup ! J'ai mis tout ca dans mon bloc note !

  4. #24
    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
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par Gagzkul Voir le message
    Euh , nah j'ai du supprimer la fin de ma phrase sans m'en rendre compte ....
    Il n'est pas interdit et même plutôt recommandé de se relire après un post, et il est possible de le corriger après coup à l'aide du bouton "Modifier le message"

    Et je souhaitais trouver les lignes ou il n'y avait que le nombre 31. Donc je me suis mal exprime (encore une fois vraiment desole ....) mais je ne cherchais que le nombre 31 avec la ligne correspondante mais ce que je voulais dire rien avant et rien apres cela voulait dire pas de X31Y juste 31 (je ne sais pas trop si je me suis fait comprendre ...)
    Non, tu ne t'exprimes toujours pas correctement, tu ne souhaites pas les lignes où il n'y a que le nombre 31 car ça exclurait aussi les lignes où il y a aussi autre chose. Ce que tu veux, ce sont les lignes où le nombre 31 apparaît de manière isolée, c'est à dire sans être accolé à d'autres caractères (hors espace).

    Cela dit, vu que ton fichier ne contient que des lignes contenant des nombres séparés par des espaces, tu n'as pas vraiment besoin d'expression régulière et tu peux utiliser :

    mais il faudrait que tu confirmes que c'est bien ce que tu veux dire avec "Je n'aimerais prendre que les lignes (avec le numéro de ligne et la ligne du dessus)"...
    ɹǝsn *sıɹɐlos*

  5. #25
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Il n'est pas interdit et même plutôt recommandé de se relire après un post, et il est possible de le corriger après coup à l'aide du bouton "Modifier le message"
    Pour une fois je peux dire que j'ai modifié mon post justement, pour avoir une fin de phrase

    Citation Envoyé par jlliagre Voir le message
    Non, tu ne t'exprimes toujours pas correctement, tu ne souhaites pas les lignes où il n'y a que le nombre 31 car ça exclurait aussi les lignes où il y a aussi autre chose. Ce que tu veux, ce sont les lignes où le nombre 31 apparaît de manière isolée, c'est à dire sans être accolé à d'autres caractères (hors espace).
    Ici, si on enlève le que (dans que le nombre 31), on arrive à ce que je souhaite

    Citation Envoyé par jlliagre Voir le message
    Hum avec ce grep on n'obtient pas les nombres style 310 justement ? Je vais faire un test tout de suite..

    Citation Envoyé par jlliagre Voir le message
    mais il faudrait que tu confirmes que c'est bien ce que tu veux dire avec "Je n'aimerais prendre que les lignes (avec le numéro de ligne et la ligne du dessus)"...
    Pour ça je pense que dans le précédent post où j'avais justement mis :

    Veux-tu seulement les lignes contenant uniquement les 2 caractères "31" et aucun caractère ni avant ni après sur la ligne? NON
    Veux-tu éviter tous les "31" directement précédés ou suivis d'un chiffre (qui représentent un autre nombre que le nombre 31)? OUI
    Veux-tu éviter une ligne contenant "31.5"? OUI
    Veux-tu éviter une ligne contenant "31A"? OUI
    Veux-tu accepter une ligne contenant "031" (qui peut être vu comme représentant le nombre 31)? NON mais de toute facon je n'en avais pas dans mon fichier

    Expliquait vraiment en détail ce que je souhaitais

  6. #26
    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
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par Gagzkul Voir le message
    Hum avec ce grep on n'obtient pas les nombres style 310 justement ? Je vais faire un test tout de suite..
    Pourquoi ne pas faire ce test avant de poster la réponse ? Il ne faut pourtant que quelques secondes pour le vérifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo 31 | grep -n -B1 -w 31
    1:31
    $ echo 310 | grep -n -B1 -w 31
    $
    Pour ça je pense que dans le précédent post où j'avais justement mis :

    Veux-tu seulement les lignes contenant uniquement les 2 caractères "31" et aucun caractère ni avant ni après sur la ligne? NON
    ...
    Veux-tu accepter une ligne contenant "031" (qui peut être vu comme représentant le nombre 31)? NON mais de toute facon je n'en avais pas dans mon fichier

    Expliquait vraiment en détail ce que je souhaitais
    Je ne vois rien dans les réponses à ces questions qui fasse référence à un « numéro de ligne » ou à « la ligne du dessus ». J'ai donc supposé que dans la sortie du script, tu souhaitais que la ligne précédent celle où 31 était trouvé devait être affichée elle aussi et que les numéros ligne devaient aussi être présent dans la sortie.
    ɹǝsn *sıɹɐlos*

  7. #27
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Gagzkul Voir le message
    Bref, exactement j'avais une liste de nombre :

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    120 54567 21567 1 234 
    12 2 31 78  4 6
    123 87 8 213 
    3 84  321 310
    31 15 78  3 1
    D'après l'exemple que tu donnes, il semble que ton fichier contienne des lignes où n'apparaissent que les chiffres de 0 à 9 et le caractère "espace" (utilisé comme séparateur entre des nombres).

    Du coup, je me rends compte que j'ai oublié une question essentielle:

    Veux-tu un "31", à la fois {soit en début de ligne soit précédé d'une espace} et également {soit en fin de ligne soit suivi d'une espace}?

    Auquel cas les solutions données par les spécialistes fonctionnent :-)


  8. #28
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Par ailleurs, j'aimerais bien comprendre le fonctionnement de "mon" grep

    ATTENTION: je sais que je suis dans le forum linux... mais je suis sous OSX (mille pardons!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    grep --version
    grep (BSD grep) 2.5.1-FreeBSD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cat plop
    31
    espace 31
    31 espace
    espace 31 espace
    D'abord, ce qui marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    grep '\(^3\| 3\)\(1 \|1$\)' plop
    31
    espace 31
    31 espace
    espace 31 espace
     
    grep '\(^\| \)31\( \|$\)' plop
    31
    espace 31
    31 espace
    espace 31 espace
    et maintenant, ce qui ne marche pas (comme je voudrais!):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    grep '\(^3\| 3\)\(1$\|1 \)' plop
    31 espace
    espace 31 espace
     
    grep '\(^\| \)31\($\| \)' plop
    31 espace
    espace 31 espace
    Il semblerait que \($\| \) ne matche pas la même chose que \( \|$\) ???
    Le "ou" ("|") ne serait pas commutatif??? ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    grep '^31$\|^31 \| 31$\| 31 ' plop
    31 espace
    espace 31 espace
     
    grep '^31$\|^31 \| 31 \| 31$' plop
    espace 31
    31 espace
    espace 31 espace
     
    grep '^31 \| 31 \|^31$\| 31$' plop
    espace 31
    31 espace
    espace 31 espace
     
    grep '^31 \| 31 \| 31$\|^31$' plop
    31
    31 espace
    espace 31 espace
    C'est quoi, ce grep???

    Y en a qui disent:
    Il m'énerve ce programme: il fait jamais ce que je veux... il fait toujours ce que je lui demande...

  9. #29
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    C'est peut-être parce qu'il utilise un moteur DFA ... ???
    Cordialement.

  10. #30
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    Veux-tu un "31", à la fois {soit en début de ligne soit précédé d'une espace} et également {soit en fin de ligne soit suivi d'une espace}?

    Auquel cas les solutions données par les spécialistes fonctionnent :-)
    Je ne comprends pas vraiment la question pour ainsi dire, tu veux dire, Si je ne voulais d'afficher que le 31 ou si je voulais que toute la ligne soit affiche ? Mon but etait juste de trouver s'il y avait existance du nombre 31 dans toute ma ligne que ce soit dans n'importe quelle colonne/ligne de mon exemple donc tant que j'avais un fichier de sortie avec le nombre 31 ca m'allait.

    mais il faudrait que tu confirmes que c'est bien ce que tu veux dire avec "Je n'aimerais prendre que les lignes (avec le numéro de ligne et la ligne du dessus)"...
    Je n'avais pas vu cette phrase .... Bref, oui je voulais les lignes contenant le nombre 31 pas forcement le numero de la ligne mais cela je sais le faire sans probleme

  11. #31
    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
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par Gagzkul Voir le message
    Je n'avais pas vu cette phrase .... Bref, oui je voulais les lignes contenant le nombre 31 pas forcement le numero de la ligne mais cela je sais le faire sans probleme
    Tu n'as toujours pas expliqué, malgré de nombreuses relances, pourquoi tu as écrit "et la ligne du dessus" dans ta question initiale et ce que cela signifie exactement.
    ɹǝsn *sıɹɐlos*

  12. #32
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    Tu n'as toujours pas expliqué, malgré de nombreuses relances, pourquoi tu as écrit "et la ligne du dessus" dans ta question initiale et ce que cela signifie exactement.
    Hum j'avoue qu'a ce moment je ne vois pas pourquoi je voulais la ligne precedente mais le :

    etait ce que je voulais a l'epoque donc la ligne qui precedait la ligne ou apparaissait le nombre 31

  13. #33
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Gagzkul Voir le message
    Mon but etait juste de trouver s'il y avait existance du nombre 31 dans toute ma ligne que ce soit dans n'importe quelle colonne/ligne de mon exemple donc tant que j'avais un fichier de sortie avec le nombre 31 ca m'allait.
    Je voulais juste aller dans la précision nécessaire pour expliquer à l'ordinateur ce qu'il doit faire!

    (c'est la manière standard dont procèdent la plupart des informaticiens)

    Donc ton fichier comprend des lignes.
    Chaque ligne contient des nombres entiers séparés par des espaces et constituant de ce fait des champs ou des colonnes.
    Et tu cherches à afficher les lignes dont au moins un champ est exactement le nombre "31".

    Pour cela, une solution est de demander à l'ordinateur d'afficher toutes les lignes contenant la chaîne "31", à condition que celle-ci soit à la fois {soit en début de ligne soit précédée d'une espace} et qu'elle soit également {soit en fin de ligne soit suivie d'une espace}, de manière à exclure les chaines "31" qui sont soit directement précédées d'un chiffre, soit directement suivies d'un chiffre, soit les deux.

    Facile, non?

    Comme souvent, une grande partie du problème est de transformer le langage naturel humain (qui est clair pour tout le monde (et en particulier pour celui qui fait la demande)) en instructions compréhensibles par un programme (en l'occurrence, ici, "grep").

  14. #34
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    Oui je vois !

    Du coup avec ce que j'ai suivi un peu dans la discussion le code nécessaire serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep ^31\s\|\s31$\|\s31\s
    C'est pas vraiment compliqué non plus il fallait juste que je définisse correctement les choses .... (un problème assez récurant lorsque je m'exprime ...)

    Ou alors le :

    Mais je viens de rechercher rapidement le -w sur la page man et on a bien la même chose non ?

    -w, --word-regexp
    Sélectionner seulement les lignes contenant les correspondances qui forment des mots entiers. Le test est que la sous-chaîne doit soit être au début de la ligne,
    soit être précédée par un caractère qui ne soit pas un constituant de mot. De la même manière, elle doit être soit à la fin de la ligne, soit être suivie par un
    caractère qui ne soit pas un constituant de mot. Les caractères constituants de mot sont les lettres, les chiffres et le caractère souligné (« _ »).

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. fonction pour compter le nombre de checkbox coché ?
    Par Death83 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 15/09/2005, 11h28
  2. [C#] Plusieurs LinkButton pour une seule fonction
    Par FunnyDjo dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/06/2005, 22h01
  3. Grep pour filtrer le fichier log
    Par devdev2003 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/02/2005, 05h48
  4. Algorithme pour trier trois nombres
    Par legosam dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 17/01/2005, 21h47
  5. Réponses: 13
    Dernier message: 20/07/2004, 08h54

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