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 :

Commande grep : motif avec *


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut Commande grep : motif avec *
    Bonjour,

    Pourquoi les commandes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    grep -i "*ce.0692835"  enquete.csv
    grep -i "*ce.0692835*" enquete.csv
    ne retournent rien

    alors que les commandes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    grep -i "ce.0692835*" enquete.csv
    grep -i "ce.0692835"  enquete.csv
    retournent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    520-876;02/06/2023 15:33;02/06/2023 15:33;MC;;;ce.0692835g@gmail.com;RURAL;378;;Oui;. . .
    Pour moi le caractère "*" signifiait "n’importe quelle séquence de caractères ou aucun caractère"

  2. #2
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Salut,

    Simplement parce que ce sont des expressions régulières et pas de joker. L'équivalent sera ".*ce.06928353.*"

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    oui, il ne faut pas confondre les regex et les motifs génériques du Développement des chemins.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut
    Merci becket,

    Difficile de s'y retrouver s'il faut considérer le caractère : *
    tantôt comme métacaractère (joker), à ce propos, je pensais utiliser des jokers en écrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    grep -i "*ce.0692835"  enquete.csv
    grep -i "*ce.0692835*" enquete.csv
    tantôt comme expression régulière.

    Peut-on savoir, suivant les situations, les commandes, ce que représente vraiment le caractère * ? c'est à dire un joker ? ou une expression régulière ?

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    . -> n'importe quel caractère
    * -> élément précédent en quantité 0 ou +
    \+ -> élément précédent en quantité 1 ou +
    \? -> élément précédent en quantité 0 ou 1

    Si on veut que soit considéré plus d'un caractère, on utilise les parenthèses (échappées évidemment).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep --color '\(bla\)\+' <<<"Et blablabla ..."

    PS: bash -> joker
    grep, sed, awk -> regex.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    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 Liamm Voir le message
    bash -> joker
    grep, sed, awk -> regex.
    Oui, la syntaxe dépend du langage utilisé.

    Par exemple, si tu écris du code en langage C, le caractère '*' peut être considéré comme un opérateur de multiplication ou comme le contenu d'un pointeur (ou autre, suivant les contextes), mais il ne sera certainement pas considéré comme un joker.

    Dans une commande shell comme grep ';ce.0692835.*@' enquete*.csv:
    - le 2ème caractère '*' s'adresse au shell. C'est un "joker", plus précisément un "motif générique" (voir commentaire de N_BaH). Dans ce contexte, il déclenche un développement de chemin et veut dire: appliquer la commande "grep" à tous les fichiers dont le nom commence par la chaine "enquete", suivie de n'importe quelle chaine, suivie de la chaine ".txt".
    - le 1er caractère "*" est destiné à être interprété par la commande "grep" et signifie: chercher la chaine ";ce.0692835", suivie de n'importe quel caractère en nombre quelconque, suivie du caractère "@".

    Dans ton cas, si tu cherches juste les lignes comportant au moins une occurrence de la chaine "ce.0692835", il est inutile de préciser que la chaine peut être précédée et suivie de n'importe quoi (dans la ligne) car c'est le comportement standard de grep (sauf si tu utilises exprès l'option "-x ou --line-regexp").

    Dans ton cas encore, attention aux lignes qui se ressemblent comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ grep 'ce.0692835' enquete.csv
    =>
    520-876;02/06/2023 15:33;02/06/2023 15:33;MC;;;ce.0692835g@gmail.com;RURAL;378;;Oui;. . .
    520-876;02/06/2023 15:33;02/06/2023 15:33;MC;;;bce.0692835g@gmail.com;RURAL;378;;Oui;. . .
    De plus, si ton fichier est un CSV pur où le point-virgule apparaît uniquement comme séparateur, il peut être judicieux d'utiliser awk pour traiter un champ particulier (par exemple, le 6ème qui doit contenir une adresse mail).

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Citation Envoyé par jack-ft
    en langage C, le caractère '*' peut être considéré comme un opérateur de multiplication
    en shell aussi, en fonction du contexte (entre parenthèses doubles, entre autres), ça peut indiquer une multiplication.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Grep d'un motif avec apostrophe et espace
    Par Dorhub dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 28/07/2022, 19h44
  2. grep -r : commande grep avec l'option -r (recursive)
    Par Liamm dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 03/09/2021, 14h36
  3. Commande grep/sed dans script bash avec regex
    Par 1r2R1 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 02/04/2014, 16h49
  4. Problème avec les commandes grep et uniq
    Par totoAussi dans le forum Linux
    Réponses: 5
    Dernier message: 04/11/2011, 14h08
  5. Réponses: 11
    Dernier message: 17/01/2010, 14h10

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