Bash regexps pour les débutants avec des exemples

Bash regexps pour les débutants avec des exemples

L'utilisation d'expressions régulières dans Bash vous offre beaucoup de puissance pour analyser presque toutes les chaînes de texte imaginables (ou même des documents complets) et les transformer en presque n'importe quelle sortie souhaitable. Si vous utilisez régulièrement Bash, ou si vous travaillez régulièrement avec des listes, des chaînes textuelles ou des documents dans Linux, vous constaterez que de nombreux emplois peuvent être simplifiés en apprenant à utiliser des expressions régulières dans Bash. Continuez à lire pour apprendre les compétences de base d'expression régulière de bash! Si vous connaissez déjà les expressions régulières de base dans Bash ou un autre langage de codage, consultez nos expressions régulières plus avancées. Sinon, continuez à lire pour apprendre les compétences de base d'expression régulière bash!

Dans ce tutoriel, vous apprendrez:

  • Comment utiliser des expressions régulières sur la ligne de commande en bash
  • Comment les expressions régulières peuvent analyser et transformer n'importe quelle chaîne de texte et / ou document
  • Exemples d'utilisation de base d'expressions régulières en bash
Bash regexps pour les débutants avec des exemples

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Indépendant de la distribution Linux
Logiciel Ligne de commande bash, système basé sur Linux
Autre L'utilitaire SED est utilisé comme exemple d'outil pour utiliser des expressions régulières
Conventions # - nécessite que les commandes Linux sont exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Exige que les commandes Linux sont exécutées en tant qu'utilisateur non privilégié régulier


Exemple 1: Notre première expression régulière

Il existe plusieurs utilitaires de ligne de commande communs comme SED et GREP qui acceptent l'entrée d'expression régulière. Et, vous n'avez pas à apporter de modifications dans l'outil (utiliser ou configurer) pour pouvoir utiliser des expressions régulières; Ils sont par défaut Regex-Aware. Regardons un exemple de non-regex où nous changeons abc dans xyz d'abord:

$ echo 'ABC' | SED 'S / ABC / XYZ /' XYZ 

Ici, nous avons utilisé l'écho pour produire la chaîne abc. Ensuite, nous passons la sortie de cet écho (en utilisant le tuyau, je.e. |, caractère) à l'utilitaire SED. SED est un éditeur de flux pour filtrer et transformer le texte. Je vous encourage à vérifier son manuel détaillé en tapant homme sed sur la ligne de commande.

Une fois passé à SED, nous transformons la chaîne en utilisant une syntaxe SED spécifique (et regexé). La commande que nous passons à sed (à savoir S / ABC / XYZ /) peut également être lu comme Remplacer ABC par WYZ. Le s signifie substitut et le caractère séparateur (/ / Dans notre cas) indique où se termine une section de la commande et / ou un autre commence. Notez que nous pouvons également utiliser d'autres caractères séparateurs dans SED, comme |, Comme nous le verrons dans des exemples ultérieurs.

Maintenant, changeons cette commande en un exemple d'expression régulière.

$ echo 'ABC' | sed 'S /./ xyz / g 'xyzxyzxyz 


Wow, qu'est-il arrivé ici? 🙂

Nous avons apporté quelques petits changements, qui ont considérablement affecté la sortie résultante. Premièrement, nous avons échangé abc dans la ligne de commande SED à .. Ce n'est pas un point régulier / littéral, mais plutôt un point d'expression régulière. Et, en expression régulière, un point signifie N'importe quel caractère. Les choses devraient commencer à être plus claires maintenant, surtout lorsque vous remarquez l'autre petit changement que nous avons fait: g. La façon la plus simple de penser g est tel que mondial; une recherche répétitive et remplacer.

Remarquez ici aussi comment s est notre commande SED réelle, suivie des options de cette commande (les deux textes de remplacement), et le g est un qualificatif sur la commande. La compréhension de cela vous aide à apprendre la syntaxe SED en même temps.

Ainsi, en contraste avec notre exemple d'expression non régulière de poing, et en langage naturel, cette nouvelle commande peut être lue comme substituer à tout caractère xyz, et de manière répétitive («globalement») jusqu'à ce que vous atteigniez la fin de la chaîne. Autrement dit, un est changé en xyz, b est changé en xyz etc., entraînant la triple sortie de XYZ.

Tout à bord? Super! Vous venez d'apprendre à utiliser des expressions régulières. Plongeons plus loin.

Exemple 2: une petite mise en garde

$ echo 'ABC' | sed 'S | \.| xyz | g 'ABC 

Oops. Ce qui s'est passé? Nous avons apporté quelques modifications mineures, et la sortie a considérablement changé, tout comme dans notre exemple précédent. Les expressions régulières sont très puissantes, comme vous pouvez commencer à le voir ici, et même un changement mineur peut faire une grande différence dans la sortie. Par conséquent, il est généralement nécessaire de bien tester vos expressions. Et, bien que ce ne soit pas le cas ici, il est également très important de toujours examiner comment la sortie des expressions régulières peut être affectée par des entrées différentes. Souvent, une entrée légèrement modifiée ou modifiée produira une sortie très différente (et souvent erronée).

Nous avons changé deux articles mineurs; Nous avons placé un \ Avant le point, et nous avons changé les séparateurs des / / pour |. Ce dernier changement n'a absolument fait aucune différence, comme nous pouvons le voir de cette sortie;

$ echo 'ABC' | SED's |.| xyz | g 'xyzxyzxyz 


Et nous pouvons doubler nos résultats jusqu'ici en utilisant cette commande:

$ echo 'ABC' | sed 'S / \./ xyz / g 'ABC 

Comme prévu, le | pour / / Le changement n'a fait aucune différence.

Retour à notre dilemme - dirons-nous que le changement mineur d'ajout \ est en faute? Mais est-ce vraiment une faute?

Non. Ce que nous avons fait en faisant ce changement simple, c'est de faire le . pointer dans un littéral (\.) point. En d'autres termes, ce n'est plus une véritable expression régulière au travail, mais un simple remplacement de chaîne textuelle qui peut être lue comme substituer tout point littéral en xyz, Et faites-le de manière répétitive.

Prouver ceci;

$ echo 'ab… c' | sed 'S / \./ xyz / g 'abxyzxyzc 

Ceci est comme prévu: les deux points littéraux ont été modifiés, individuellement (en raison de la nature répétitive du g qualificateur), pour xyz, Rendement global abxyzxyzc.

Super! Élargissons un peu plus maintenant.

Exemple 3: Apportez-le

Rien de tel que la plongée dans la tête d'abord, à droite? Peut-être. Jusqu'à ce que vous voyiez cela;

$ echo 'a… b… c' | sed 'S | [\.b] \ + | d | g; s | [a-c] | d | g 'ddd 

Oui, trop complexe, au moins à première vue. Commençons par une simplification de celle-ci:

$ echo 'a… b… c' | sed 'S | [\.b] \ + | d | g; ' ADC 


A toujours l'air un peu délicat, mais vous le comprendrez bientôt. Donc, en prenant la chaîne d'entrée de a… b… c, Nous pouvons voir - sur la base de notre exemple précédent - que nous recherchons un point littéral (\.). Cependant, dans ce cas, il est suivi de b et entouré de [ et ]]. Cette partie de l'expression régulière ([\.b]) peut être lu comme tout point littéral, ou le personnage b (Jusqu'à présent, non répétimment; je.e. Une seule charte, l'un d'eux, correspondra à ce sélecteur).

Ensuite, nous nous qualifions un peu plus en ajoutant \+ pour ça boîte de sélection. Le \+ indique que nous recherchons au moins un, et peut-être plus, de ces caractères énumérés (point littéral et b). Notez que les caractères recherchés doivent être juste à côté les uns des autres, dans n'importe quel ordre.

Par exemple le texte … B… BBBB… serait encore adapté en un seul événement, alors que … B… bbb… b.B… BB (notez l'espace) correspondait à une correspondance séparée (répétitif) occurrences, et les deux (je.e. pas seulement le premier) serait égalé. Et, dans ce cas, les deux seraient traités à cause du g qualificatif mondial / répétitif.

En d'autres termes, en langage naturel, nous pouvions lire cette expression régulière comme remplacer toute séquence contigu des caractères . et b avec d Et faites-le de manière répétitive.

Pouvez-vous voir ce qui se passe? Dans la chaîne d'entrée, nous avons … B… , qui est apparié par l'expression régulière car elle ne contient que \. et b personnages. Il est ensuite substitué à d résultant en ADC.

Notre plus grand exemple semble maintenant plus simple. Revenons-y:

$ echo 'a… b… c' | sed 'S | [\.b] \ + | d | g; s | [a-c] | d | g 'ddd 

Penser à la façon dont la première partie de la commande SED s'est transformée a… b… c dans ADC, Nous pouvons maintenant y penser ADC comme entrée à la deuxième commande du sed; s | [a-c] | d | g. Remarquez comment les deux commandes SED sont séparées par ;.

Tout ce qui se passe, c'est que la sortie du premier est prise comme entrée pour la commande suivante. Cela fonctionne presque toujours, bien qu'il y ait des moments (lors de l'utilisation de la modification complexe du texte / document) où il vaut mieux passer la sortie d'une commande SED réelle dans une autre commande SED en utilisant un tuyau bash (|).

Analyse de la deuxième commande (s | [a-c] | d | g) Nous voyons comment nous en avons un autre boîte de sélection qui sélectionnera les lettres de A à C ([A-C]))); le - indique une gamme de lettres, qui fait partie de la syntaxe d'expression régulière.

Les autres parties de cette commande parlent d'elles-mêmes maintenant. Au total, cette deuxième commande peut ainsi être lue comme Remplacez tout caractère littéral par portée A-C (I.e. a, b ou c) dans d Et faites-le de manière répétitive. Le résultat est que le A, D et C (sortie de ADC de notre première commande) sont rendus en DDD.

Cette commande très complexe n'a plus l'air si effrayant maintenant, le fait? Resterons.

Exemple 4: un message de séparation

Echo «Passez une bonne journée» | sed 's | $ | tout |; s | y | y à |; s | $ | vous |; s | à [la] \ + | à | g; s | $ | Tout | ' 


Pouvez-vous le comprendre? Conseil; $ moyens fin de ligne Dans les expressions régulières. Tout le reste de ce complexe Regex utilise les connaissances de cet article. Quelle est la sortie? Voyez si vous pouvez le comprendre en utilisant un morceau de papier, sans utiliser la ligne de commande. Si vous l'avez fait - ou si vous ne l'avez pas fait - faites-le nous savoir dans les commentaires ci-dessous.

Conclusion

Dans ce tutoriel, nous avons eu une introduction aux expressions régulières de base, jointes à quelques exemples plus avancés (ironique) plus avancés.

Lorsque vous apprenez des expressions régulières et de la vérification du code des autres, vous verrez des expressions régulières qui semblent complexes. Prenez le temps de les comprendre et jouez avec des expressions régulières sur la ligne de commande. Vous serez bientôt un expert, et bien que l'analyse des regex experts complexes soit généralement nécessaire (l'esprit ne se prête tout simplement pas facilement à la lecture des informations aussi denses), elle deviendra plus facile. Vous constaterez également qu'un regex rage complexe, à une analyse plus approfondie, semble généralement assez simple une fois que vous le comprenez - tout comme dans les exemples ci-dessus.

Vous pouvez maintenant également lire notre article sur les expressions régulières dans Python, car de nombreuses informations fournies s'appliquent également aux expressions régulières, bien que certaines des exigences de mise en forme soient légèrement différentes. Cela renforcera votre compréhension des expressions régulières, comment les utiliser et comment les appliquer dans diverses situations et langues codantes. Une fois que vous devenez un expert Regex, les petites lignes de distinction entre les outils et les langages de programmation se sont généralement s'estompées, et vous aurez tendance à vous souvenir des exigences de syntaxe spécifiques pour chaque langue ou outil dans lequel vous travaillez / avec.

Apprécier!

Tutoriels Linux connexes:

  • Advanced Bash Regex avec des exemples
  • Choses à installer sur Ubuntu 20.04
  • Python Expressions régulières avec des exemples
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Manipulation des mégadonnées pour le plaisir et le profit Partie 3
  • Manipulation de Big Data pour le plaisir et le profit Partie 1
  • Choses à faire après l'installation d'Ubuntu 22.04 Jammy Jellyfish…
  • Choses à installer sur Ubuntu 22.04
  • Bash Idioms variables avancées pour la sensibilité à la caisse…