Bash linux 8 : EGrep et les expressions régulières

in utopian-io •  7 years ago  (edited)

EGrep et les expressions régulières

Introduction

This article is about regular expressions and the use of the command egrep with regular expressions.

Qu'est ce que c'est une expression régulière?

les expressions régulières sont similaires aux méta-caractères.Elles nous permettent de représenter des modèles de chaînes de caractère(séquence de caractères), sauf qu'elles sont plus puissants. Elles sont utilisées pour manipuler des parties spécifiques du data. Par exemple, on souhaite identifier toute ligne contenant une adresse email, un url dans un ensemble d'informations.

On va démontrer l'utilisation de la commande egrep avec les expressions régulières, ces dernières sont utilisées avec les commandes vi et sed par exemple, les langages de programmation s'en servent aussi.

Note:

les caractères utilisés dans les expressions régulières sont les memes utilisés dans les méta-caractères. Leurs comportements est légèrement différents. Une faute courante est d'oublier ça et confondre leurs fonctions.

eGrep

eGrep est un programme qui se charge de chercher un ensemble d'informations donné et affiche toute ligne contenant la séquence de caractère donnée. Il s'agit de l'extension d'un programme appelé grep. eGrep a plusieurs options de ligne de commande qui modifient son comportement.

egrep [options de ligne de commande] <pattern> [chemin d acces]

On utilisera comme exemple le même fichier qu'on a utilisé dans la partie des filtres .

user@bash: cat simpledata.txt
maths exam1 18
physique exam1 16
français exam1 15
archiordi exam1 16
logicieldeb examen 14
visualbasic 15
structdedonnees 16
programmationc 14
circuitslogiques 15
mecaniquedesfluides 17
rdm 17
comptabilité 18
user@bash:

On veut maintenant identifier toute ligne qui contient la chaine de caractères exam.

user@bash: egrep 'exam' simpledata.txt
maths exam1 18
physique exam1 16
français exam1 15
archiordi exam1 16
logicieldeb examen 14
user@bash:

Le comportement normal de egrep est d'afficher toute ligne qui contient la chaine de caractères correspondante à la séquence de caractère donnée, il faut noter qu'on est pas à la recherche d'un mot mais d'une chaine de caractères.

Parfois, en plus de la ligne qui contient la chaine de caractères correspondante à la séquence de caractère donnée, on a besoin de savoir le numéro cette ligne.

user@bash: egrep -n 'exam' simpledata.txt
1:maths exam1 18
2:physique exam1 16
3:français exam1 15
4:archiordi exam1 16
5:logicieldeb examen 14
user@bash:

Ou peut être on a juste besoin de savoir le nombre de lignes correspondante à notre recherche.

user@bash: egrep -c 'exam' simpledata.txt
5 
user@bash:

Apprendre les expressions régulières

Si jamais vous avez du mal à comprendre la sortie de la commande, il faut recourir alors à des stratégies basiques.

  • Premièrement, faites attention aux erreurs typographiques.
  • Relisez le contenu. Il est possible que vous avez fait appel à un opérateur qui modifie légèrement ce que vous voulez vraiment faire.
  • Décomposez votre séquence de caractères à des parties individuelles et testez chaque partie de la séquence. Cela vous permettra de savoir la partie de la séquence qui vous pose problème afin de l'ajuster.
  • Examinez vos données de sortie.

Debuggex est un outil en ligne qui va vous permettre de se familiariser avec les expressions régulières dans le but de visualiser leurs comportements.

Une vue générale sur les expressions régulières

On va exposer les symboles de bases dans les expressions régulières puis on va donner quelques exemples pour les illustrer.

  • .(point)-un seul caractère.
  • ?- Indique 0 ou une occurrence du caractère précédent.
  • *****-indique 0 ou plusieurs occurrences du caractère précédent.
  • +-indique 1 ou plusieurs occurrences du caractère précédent.
  • {n}-indique exactement n occurrences de caractère précédent.
  • {n,m}-indique au moins n occurences et au plus m occurrences.
  • [agd]-le caractère est l'un des caractères compris entre les crochets.
  • [^agd]-le caractère n'est pas l'un des caractères compris entre les crochets.
  • [c-f]-le tiret sert de préciser qu'il s'agit d'un intervalle, le caractère n'est pas (c,d,e,f).
  • ()-ça nous permet de rassembler plusieurs caractères pour qu'ils se comportent en tant qu'un seul caractère.
  • |-(barre verticale) l'opération logique ou.
  • ^-indique le début de la ligne.
  • $-indique la fin de la ligne.

D'autres exemples

On va commencer avec quelque chose de simple. On veut identifier toute ligne qui contient 2 voyelles ou plus dans la rangée.

user@bash: egrep '[mifg]{2,}' simpledata.txt
logicieldeb examen 14
programmationc 14
circuitslogiques 15
user@bash:

Maintenant on veut afficher toute ligne qui contient 1 mais celui-ci ne doit pas se trouver à la fin de la ligne, l'opérateur + fait l'affaire.

user@bash: egrep '1.+' ssimpledata.txt
maths exam1 18
physique exam1 16
français exam1 15
archiordi exam1 16
logicieldeb examen 14
visualbasic 15
structdedonnees 16
programmationc 14
circuitslogiques 15
mecaniquedesfluides 17
rdm 17
comptabilité 18
user@bash:

Maintenant, on veut afficher toute ligne qui termine par le caractère 4 .

user@bash: egrep '4$' simpledata.txt
logicieldeb examen 14
programmationc 14
user@bash:

Et maintenant, on veut afficher toute ligne qui contient 'su', 'ba'ou'don'.

user@bash: egrep 'ba|su|don' simpledata.txt
visualbasic 15
structdedonnees 16
user@bash:

Pour conclure voici un petit example qui permet de détecter un numéro de téléphone :

Dans un fichier (qu'on va appeler fichier) on met :

+33677578940
+32677578940
+337589404
+336 77 57 89 40
+336 7 7 5 7 8 9 4 0

Ce qui nous donne :

user@bash:~$ cat fichier
+33677578940
+32677578940
+337589404
+336 77 57 89 40
+336 7 7 5 7 8 9 4 0

Donc :

+33677578940 <= numéro correct
+32677578940 <= numéro belge donc incorrect
+337589404 <= trop court
+336 77 57 89 40 <= correct
+336 7 7 5 7 8 9 4 0 <= correct

Donc on veut pouvoir détecter des numéros de téléphone avec le +33 d'internationalization français, gérer les espaces (mais pas en accepter plus d'un entre deux chiffres) et permettre d'avoir des espaces entre tous les chiffres ou tous les deux chiffres.

pour ça on regarde la structure d'un numéro de téléphone

+33677578940

on a +33 suivi de 9 chiffres.

Donc on peut facilement faire une regexp comme ceci :

\+33([0-9]){9}

C'est bien mais ça ne gère pas les espaces. Pour ça il suffit d'ajouter des "ou"

par exemple

(| )

Cela signifie "vide ou un espace

Et donc il suffit de tout rassembler :

+33(| ) pour gérer l'espace entre le +33 et le premier chiffre

Puis

([0-9](| )){9}

pour gérer le reste des chiffres et permettre les espaces.

Notez qu'il est simple de gérer d'autres symboles comme des : des / etc en les ajoutant :

([0-9](| |:|/)){9}

etc.

on appelle donc egrep ainsi :

user@bash:~$ egrep '\+33(| )([0-9](| )){9}' fichier
+33677578940
+336 77 57 89 40
+336 7 7 5 7 8 9 4 0

Ce qui nous sors donc les lignes qui correspondent aux tests corrects hourra !



Posted on Utopian.io - Rewarding Open Source Contributors

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  
  ·  7 years ago (edited)

Your contribution cannot be approved yet. See the Utopian Rules. Please edit your contribution to reapply for approval.

Explanation:

  • although I did approve your Bash Linux parts 6 and 7 just now, I'm having doubts whether you actually wrote these tutorials or simply auto-translated them from a book to French,
  • anyway: this tutorial is supposed to be about using the grep command, yet that isn't covered at all,
  • so in this instance, I want you to properly address how-to use the grep command AND properly address regex'es:

To prove to me you actually master Regex, I have a simple task for you to include in this article, being:

write a working regular expression that is able to distinguish a French telephone number from a Belgian telephone number and/or IPv4 address.

Good luck!
@scipio

You can contact us on Discord.
[utopian-moderator]

Hello,

I talk about egrep because it's simply a shortcut for grep -E but sure if you prefer, I edited all grep to egrep so this is a tutorial for egrep.

As for the regexp you can find it at the end of the tutorial.

I did not really understand your challenge though I understood it as "do a french number checker or an ip address checker or a belgian number checker"

Well, you didn't completely finish my task the way I intended, but still you proved to me that you actually understood the concept of it all. I just needed to make sure you didn't just copy / auto-translate this article from some eBook in English to French. Of course I knew about grep vs egrep myself, and by renaming the article headline (you can't re-edit the url of course) to egrep is also fine by me.

Approved!
@scipio

Thanks a lot :)

Thank you for the contribution. It has been approved.

You can contact us on Discord.
[utopian-moderator]

Hey @raptorjesus I am @utopian-io. I have just upvoted you!

Achievements

  • You have less than 500 followers. Just gave you a gift to help you succeed!
  • Seems like you contribute quite often. AMAZING!

Suggestions

  • Contribute more often to get higher and higher rewards. I wish to see you often!
  • Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck!

Get Noticed!

  • Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions!

Community-Driven Witness!

I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!

mooncryption-utopian-witness-gif

Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x