Probleme expressions commande man man | grep -e “reg_expr"*
Résolu/Fermé
45K
Messages postés
13
Date d'inscription
dimanche 20 décembre 2020
Statut
Membre
Dernière intervention
8 juin 2023
-
Modifié le 27 janv. 2023 à 17:06
mamiemando Messages postés 33327 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 octobre 2024 - 27 janv. 2023 à 17:36
mamiemando Messages postés 33327 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 octobre 2024 - 27 janv. 2023 à 17:36
A voir également:
- Man grep -v
- Slender man jeu - Télécharger - Tir FPS
- Hyper v download - Télécharger - Divers Utilitaires
- Net framework 4.0 v 30319 windows 7 - Télécharger - Divers Utilitaires
- Man strlcpy - Forum C
- Comment invoquer le slender man ✓ - Forum Loisirs / Divertissements
1 réponse
mamiemando
Messages postés
33327
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
28 octobre 2024
7 799
Modifié le 27 janv. 2023 à 17:43
Modifié le 27 janv. 2023 à 17:43
Bonjour,
Pour apprendre à utiliser grep, je t'invite à utiliser l'option --color. En rouge, tu verras apparaître ce qui a été "grepé".
- Le méta-caractère "." signifie n'importe quel caractère. Ce n'est pas ce que demande la question, on veut filtrer sur le caractère "." qui s'écrit en expression rationnelle "\." ou "[.]". L'option -e est ici inutile car tu n'utilise pas d'opérateur avancé.
man man | grep --color "[.]$"
- Je pense que tu n'as pas compris ce que tu as écrit.
- Le caractère "$" ancre le motif en fin de ligne. Par exemple si tu fais un grep en utilisant l'expression rationnelle "xyz$", tu cherches les lignes qui finissent par xyz. En l'occurrence, je pense que tu cherches les lignes contenant quatre chiffres consécutifs, où qu'il soient dans la ligne. Le caractère $ est donc en trop.
- Le caractère "*" a un sens différent selon où tu le mets.
- À l'extérieur des guillements, le shell substitue * par la liste des fichiers dans le dossier courant.
- Dans les guillements, c'est l'étoile de Kleene, qui indique qu'il faut chercher un motif répété n fois, avec n >= 0. Cela reviendrait donc à chercher une séquence de 0 entiers, 4 entiers, 8 entiers, etc.
- Dans tous les cas, on voit que * n'a aucune utilité pour cette question
- On a besoin de l'option "-e" avec grep ou il faut utiliser egrep car tu utilises l'opérateur {}. C'est adapté dans le cas présent :
man man | grep --color -e "[0-9]\{4\}" man man | egrep --color "[0-9]{4}"
- On aurait pu aussi écrire ceci (bien que ce soit moins élégant) :
man man | grep --color "[0-9][0-9][0-9][0-9]"
- Je pense que tu devrais relire ton cours sur les expressions rationnelles.
- Pour rappel, une expression rationnelle est une manière de modéliser un automate non déterministe (NFA) qui capture un langage régulier en le représentant par une chaîne de caractère, comme l'explique cette page.
- Quand tu écris une expression rationnelle, ce serait donc une bonne idée que tu dessines le NFA correspondant et que tu te demandes s'il a une chance de capturer les chaînes qui t'intéressent.
- Tu peux ensuite déterminiser cet automate pour en améliorer la lisibilité (DFA).
- Voici ce que ça donne avec ta solution :
- On part de l'état initial (0). On doit arriver à un état final (double cercle) pour capturer une chaîne.
- Les transitions étiquetés par epsilon peuvent être traversées sans consommer de caractère.
- Les transitions sans étiquette sont en réalité étiquetés par le caractère espace (qui ne se voit pas).
- Les autres transitions consommer le caractère qui les étiquette.
- Étant donné un mot, on part de l'état 0 et on regarde où le premier caractère pour déterminer le prochain état courant.
- Dans le cas d'un DFA, cela correspond à 0 ou 1 état cible. Par exemple dans le DFA on voit que si le premier caractère est une voyelle, on peut atteindre l'état 1 et continuer à jouer. Sinon perdu, il n'y a pas d'état cible et donc la chaîne qu'on traite n'est pas capturée.
- Dans le cas du NFA, il peut y avoir 0, 1 ou plusieurs états cibles.
- On répète la procédure en avançant, caractère par caractère, jusqu'à atteindre la fin du mot. Si l'état courant est un état final (double cercle), le mot est capturé par l'automate, et donc par n'importe quelle expression rationnelle qui lui correspond.
- Dans la solution que tu proposes, tu as écrit :
- "[a e i o u y]": cherche un caractère parmi {'a', 'e', 'i', 'o', 'u', 'y', ' '} : ce serait donc plutôt "[aeiouy]".
- " *": puis cherche le caractère " " répété 0 ou plus
- "s*": puis cherche le caractère "s" répété 0 ou plus
- Je te laisse à la lumière de ces explications données réfléchir à la troisième réponse.
- Pour rappel, une expression rationnelle est une manière de modéliser un automate non déterministe (NFA) qui capture un langage régulier en le représentant par une chaîne de caractère, comme l'explique cette page.
Bonne chance