GNU/Linux >> Tutoriels Linux >  >> Linux

Expressions régulières :tout rassembler

Dans Présentation des expressions régulières , j'ai présenté le concept et les bases, puis dans Démarrer avec les expressions régulières :un exemple , nous avons parcouru un exemple qui nettoie les listes de noms et d'adresses e-mail afin qu'elles soient cohérentes et analysables. Après notre plongée dans Regex et grep :flux de données et blocs de construction , où nous avons approfondi les expressions régulières, il est maintenant temps d'explorer les moyens de raccourcir et de simplifier le programme de ligne de commande du premier exemple. Nous allons nous concentrer ici sur grep et sed .

Exemple :Simplifier le programme de liste de diffusion

Tout d'abord, revenons à notre premier exemple, où nous avons créé le programme d'interface de ligne de commande (CLI) suivant :

cat Experiment_6-1.txt | grep -v Team | grep -v "^\s*$" | sed -e "s/[Ll]eader//" -e "s/\[//g" -e "s/]//g" -e "s/)//g" -e "s/(//g" | awk '{print $1" "$2" <"$3">"}'

Vous trouverez peut-être les expressions régulières plus faciles à lire à ce stade, mais ce programme peut être simplifié.

chat et grep

Commençons par nous concentrer sur le début de la commande, qui implique cat et grep :

cat Experiment_6-1.txt | grep -v Team | grep -v "^\s*$"

On peut combiner les deux grep instructions, qui à l'origine ressemblent à ceci :

| grep -v Team | grep -v "^\s*$" 

Astuce : Lorsque le STDOUT de grep n'est pas acheminé via un autre utilitaire, et lors de l'utilisation d'un émulateur de terminal prenant en charge la couleur, les correspondances d'expression régulière sont mises en surbrillance dans le flux de données de sortie.

La commande révisée est :

grep -vE "Team|^\s*$"

Ici, nous avons ajouté le E option, qui spécifie l'expression régulière étendue. Selon le grep page de manuel :

"Dans GNU grep, il n'y a aucune différence dans les fonctionnalités disponibles entre les syntaxes de base et étendues."

Cette affirmation n'est pas strictement vraie, car notre nouvelle expression combinée échoue sans le E option. Exécutez ce qui suit pour voir les résultats :

[student@studentvm1 testing]$ cat Experiment_6-1.txt | grep -vE "Team|^\s*$"

Essayez sans le E option.

Maintenant, regardons cat . Le grep l'outil peut également lire les données d'un fichier, nous pouvons donc éliminer le cat commande entièrement :

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt

Ce changement et le précédent nous laissent avec le programme CLI suivant, quelque peu simplifié :

grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/\[//g" -e "s/]//g" -e "s/)//g" -e "s/(//g" | awk '{print $1" "$2" <"$3">"}'

Cette commande est plus courte, plus succincte et s'exécutera plus rapidement car grep n'a besoin d'analyser le flux de données qu'une seule fois.

Remarque : Encore une fois, il est important de réaliser que cette solution n'est pas la seule. Il existe différentes méthodes dans Bash pour produire la même sortie, et il existe d'autres langages comme Python et Perl qui peuvent également être utilisés. Et, bien sûr, il y a toujours des macros LibreOffice Writer. Mais je peux toujours compter sur Bash dans le cadre de toute distribution Linux. Je peux effectuer ces tâches à l'aide de programmes Bash sur n'importe quel ordinateur Linux, même un sans bureau GUI, ou un qui a un bureau GUI mais sur lequel LibreOffice n'est pas installé.

sed

Nous pouvons également simplifier le sed commande. Le sed L'utilitaire permet non seulement de rechercher du texte qui correspond à un modèle de regex, mais il peut également modifier, supprimer ou remplacer le texte correspondant. J'utilise sed sur la ligne de commande et dans les scripts shell Bash comme un moyen rapide et facile de localiser du texte et de le modifier. Le nom sed signifie éditeur de flux car il fonctionne sur des flux de données de la même manière que d'autres outils capables de transformer un flux de données. La plupart de ces modifications impliquent de sélectionner des lignes spécifiques dans le flux de données et de les transmettre à un autre programme de transformation.

Remarque : Beaucoup de gens appellent des outils comme grep filtrer les programmes , car ils filtrent les lignes indésirables du flux de données. Je préfère le terme transformateurs , car des outils comme sed et awk faites plus que filtrer. Ils peuvent tester le contenu pour différentes combinaisons de chaînes et modifier le contenu correspondant de différentes manières. Des outils comme sort , head , tail , uniq , fmt , et plus encore, transforment tous le flux de données d'une manière ou d'une autre.

Nous avons déjà vu sed en action, mais maintenant, avec une compréhension des expressions régulières, nous pouvons mieux analyser et comprendre notre utilisation antérieure. Il est possible de combiner quatre des cinq expressions utilisées dans le sed commande en une seule expression. Le sed commande a maintenant deux expressions au lieu de cinq :

sed -e "s/[Ll]eader//" -e "s/[]()\[]//g"

Ce format rend un peu difficile la compréhension de l'expression plus complexe. Notez que peu importe le nombre d'expressions qu'un seul sed commande contient, le flux de données n'est analysé qu'une seule fois pour correspondre à toutes les expressions.

Examinons de plus près l'expression révisée :

-e "s/[]()\[]//g"

Par défaut, sed interprète tous les [ caractères comme début d'un ensemble, et le dernier ] caractère comme la fin de cet ensemble. Ainsi, dans le code ci-dessus, le premier [ et le dernier ] contenir l'ensemble. Le ] intermédiaire les caractères ne sont pas interprétés comme des métacaractères.

Puisque nous devons faire correspondre [ comme un caractère littéral afin de le supprimer du flux de données, et sed interprète normalement [ en tant que métacaractère, nous devons lui échapper afin qu'il soit interprété comme un ] littéral . C'est là que la barre oblique inverse (\ ) arrive, nous donnant \[ au milieu.

Branchons cette nouvelle version dans le script CLI et testons-la :

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[]()\[]//g"

Je sais ce que vous demandez :"Pourquoi ne pas placer le \[ après le [ qui ouvre l'ensemble, et avant le ] personnage ?" Essayez comme je l'ai fait :

[student@studentvm1 testing]$  grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[\[]()]//g"`

Je pense que cela devrait fonctionner, mais ce n'est pas le cas. De petits résultats inattendus comme celui-ci montrent clairement que nous devons être prudents et tester soigneusement chaque expression régulière pour nous assurer qu'elle fait réellement ce que nous avons l'intention.

Après quelques expérimentations personnelles, j'ai découvert que l'accolade gauche échappée \[ fonctionne bien dans toutes les positions de l'expression à l'exception de la première. Ce comportement est noté dans le grep page de manuel, que j'aurais probablement dû lire en premier. Cependant, je trouve que l'expérimentation renforce les choses que je lis et je découvre généralement des choses plus intéressantes que ce que je cherchais.

Ajout du dernier composant, le awk déclaration, notre programme optimisé ressemble à ceci et les résultats sont exactement ce que nous voulons :

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[]()\[]//g" | awk '{print $1" "$2" <"$3">"}'

Autres outils qui implémentent des expressions régulières

De nombreux outils Linux implémentent des expressions régulières. La plupart de ces implémentations sont très similaires à celle de awk , grep , et sed , il devrait donc être facile d'apprendre les différences. Bien que nous n'ayons pas examiné en détail awk, il s'agit d'un puissant langage de traitement de texte qui implémente également des regex.

La plupart des éditeurs de texte les plus avancés utilisent des regex. Vim, gVim, Kate et GNU Emacs ne font pas exception. Le less implémente les expressions régulières, tout comme la fonction de recherche et de remplacement de LibreOffice Writer.

Les langages de programmation tels que Perl, awk et Python contiennent également des implémentations d'expressions régulières, ce qui les rend bien adaptés à l'écriture d'outils de manipulation de texte.

Ressources

J'ai trouvé d'excellentes ressources pour apprendre les expressions régulières. Il y en a plus que ce que j'ai énuméré ici, mais ce sont ceux que j'ai trouvés particulièrement utiles :

  • Le grep La page de manuel a une bonne référence mais n'est pas appropriée pour apprendre les expressions régulières.
  • Le livre d'O'Reilly, Maîtriser les expressions régulières , de Jeffrey E. F. Friedl, est un bon tutoriel et une référence pour les expressions régulières. Je le recommande à tous ceux qui sont ou veulent être un administrateur système Linux car vous utiliserez des expressions régulières.
  • Le livre d'O'Reilly sed &awk :UNIX Power Tools , d'Arnold Robbins et Dale Dougherty, est un autre bon. Il couvre ces deux outils puissants et contient également une excellente discussion sur les expressions régulières.

Il existe également de bons sites Web qui peuvent vous aider à en savoir plus sur les expressions régulières et qui fournissent des exemples intéressants et utiles de regex de style livre de recettes. Il y en a qui demandent de l'argent en échange de leur utilisation. Jason Baker, mon réviseur technique pour les volumes 1 et 2 de mon Utilisation et administration de Linux cours suggère regexcrossword.com comme un bon outil d'apprentissage.

Résumé

Cette série a fourni une brève introduction au monde complexe des expressions régulières. Nous avons exploré l'implémentation des regex dans le grep utilitaire suffisamment détaillé pour vous donner une idée de certaines des choses incroyables qui peuvent être accomplies avec les regex. Nous avons également examiné plusieurs outils Linux et langages de programmation qui implémentent également des regexes.

Mais ne vous méprenez pas ! Nous n'avons fait qu'effleurer la surface de ces outils et des expressions régulières. Il reste encore beaucoup à apprendre et, comme vous pouvez le voir, il existe d'excellentes ressources pour le faire.

Remarque : Cet article est une version légèrement modifiée du chapitre 6 du volume 2 de mon cours d'autoformation Linux, "Utilisation et administration de Linux :de zéro à SysAdmin", qui doit sortir d'Apress fin 2019.


Linux
  1. Répertorier toutes les adresses e-mail dans un fichier avec grep

  2. Bash :Expressions régulières en substitution ?

  3. Pourquoi `\d` ne fonctionne-t-il pas dans les expressions régulières de sed ?

  4. Comment grep une chaîne dans un répertoire et tous ses sous-répertoires ?

  5. Lister tous les appareils ALSA

Initiation aux expressions régulières

Expressions régulières dans Grep (Regex)

Comment Grep pour plusieurs chaînes et modèles

Présentation des expressions régulières

Comment effectuer une recherche Grep sur tous les fichiers et dans tous les répertoires

10 exemples pratiques de regex avec grep