En utilisant des expressions régulières dans awk

En utilisant des expressions régulières dans awk

Les expressions régulières sont un outil puissant pour le traitement de texte dans AWK. Ils vous permettent de rechercher des modèles dans un fichier texte et de manipuler les données en fonction de ces modèles. Dans cet article, nous explorerons comment utiliser des expressions régulières dans awk avec des exemples.

Bases d'expression régulière

Les expressions régulières sont des modèles qui correspondent à un ensemble spécifique de caractères. Le tableau suivant répertorie certains des métacharacteurs d'expression régulière de base que vous pouvez utiliser dans awk:

MétacharacterDescription
.Correspond à n'importe quel personnage unique
[]Correspond à n'importe quel personnage entre les supports
^Correspond au début d'une ligne
$Correspond à la fin d'une ligne
*Correspond à zéro ou plus d'occurrences du caractère précédent
+Correspond à une ou plusieurs occurrences du personnage précédent
?Correspond à zéro ou à une occurrence du caractère précédent

AWK fournit deux fonctions intégrées pour utiliser des expressions régulières: correspondre() et sous(). Le correspondre() La fonction est utilisée pour trouver la première occurrence d'une expression régulière dans une chaîne, et sous() est utilisé pour remplacer la première occurrence d'une expression régulière dans une chaîne. Voici quelques exemples:

Exemple 1: correspondant à une expression régulière

Disons que nous avons un fichier contenant une liste d'adresses e-mail, et nous voulons trouver toutes les adresses e-mail qui se terminent par ".com ». Nous pouvons utiliser le correspondre() Fonction pour accomplir cette tâche comme suit:

awk 'if (match ($ 0, / \.com $ /)) print $ 0 'e-mail.SMS
12345awk 'if (match ($ 0, / \.com $ /)) print $ 0 'e-mail.SMS

Ici, nous utilisons le correspondre() fonction pour rechercher l'expression régulière / /.com $ / (qui correspond à n'importe quelle chaîne qui se termine avec ".com ») dans chaque ligne du fichier. Si un match est trouvé, nous imprimons la ligne.

Exemple 2: remplacer une expression régulière

Disons que nous avons un fichier contenant une liste de numéros de téléphone, et nous voulons remplacer toutes les instances de «555» avec «666». Nous pouvons utiliser le sous() Fonction pour accomplir cette tâche comme suit:

awk 'sub (/ 555 /, "666", $ 0) Imprimer $ 0' téléphone.SMS
1234awk 'sub (/ 555 /, "666", $ 0) Imprimer $ 0' téléphone.SMS

Ici, nous utilisons le sous() fonction pour rechercher l'expression régulière / 555 / (qui correspond à toute chaîne contenant «555») dans chaque ligne du fichier, et la remplacer par «666». Nous imprimons ensuite la ligne modifiée.

Techniques d'expression régulière avancées

En plus des métacharacteurs d'expression régulière de base, AWK prend en charge plusieurs techniques d'expression régulière avancées qui peuvent vous aider à accomplir des tâches de traitement de texte plus complexes. Ceux-ci inclus:

1. Regroupement:

Vous pouvez regrouper des parties d'une expression régulière en utilisant des parenthèses. Cela vous permet d'appliquer un quantificateur au groupe dans son ensemble, ou d'extraire des parties spécifiques de la chaîne correspondante.

Disons que nous avons un fichier contenant une liste de noms et de salaires d'employés, et nous voulons extraire les noms et les salaires séparément. Nous pouvons utiliser le regroupement pour accomplir cette tâche comme suit:

awk 'if (correspond ($ 0, / ^ (\ w +) \ s + (\ d +) $ /)) name = substr ($ 0, rstart, rLength) salaire = substr ($ 0, rstart + longueur (name) +1 .SMS
12345678awk 'if (correspond ($ 0, / ^ (\ w +) \ s + (\ d +) $ /)) name = substr ($ 0, rstart, rLength) salaire = substr ($ 0, rstart + longueur (name) +1 .SMS

Ici, nous utilisons le regroupement pour correspondre à l'expression régulière / ^ (\ w +) \ s + (\ d +) $ / (qui correspond à une ligne contenant un ou plusieurs caractères de mot suivis d'un ou plusieurs caractères d'espace, suivi d'un ou plusieurs chiffres) et extraire le nom et le salaire séparément.

2. Détalonnets:

Vous pouvez utiliser des références de back-.e., \ 1, \ 2, etc.) pour faire référence aux parties de l'expression régulière qui ont été appariées par un groupe. Cela vous permet de réutiliser les sous-chaînes appariées dans la chaîne de remplacement.

Disons que nous avons un fichier contenant une liste de numéros de téléphone au format (xxx) xxx-xxxx, et nous voulons modifier le format en xxx-xxx-xxxx. Nous pouvons utiliser des références pour accomplir cette tâche comme suit:

awk 'sub (/ \ \ ((\ d 3) \) (\ d 3) - (\ d 4) /, "\ 1- \ 2- \ 3", $ 0) imprimer $ 0 ' téléphone.SMS
1234awk 'sub (/ \ \ ((\ d 3) \) (\ d 3) - (\ d 4) /, "\ 1- \ 2- \ 3", $ 0) imprimer $ 0 ' téléphone.SMS

Ici, nous utilisons des références (je.e., \ 1, \ 2, et \ 3) pour se référer aux trois groupes de chiffres appariés par l'expression régulière «/ (\ D3) (\ d3) (\ d 3) - (\ d 4) /» (qui correspond à un numéro de téléphone au format (xxx) xxx-xxxx) et remplacez le format par xxx-xxx-xxxx.

3. Lookahead et lookbehind:

Vous pouvez utiliser lookahead (?=) et regardez (?<=) Pour faire correspondre les modèles uniquement s'ils sont suivis ou précédés d'un autre modèle, respectivement.

Disons que nous avons un fichier contenant une liste d'URL, et nous voulons extraire uniquement les noms de domaine (je.e., le texte entre "Http: //" et la prochaine "/" personnage). Nous pouvons utiliser Lookahead et LookBehind pour accomplir cette tâche comme suit:

awk 'if (correspond ($ 0, / (?<=http:\/\/)[^\/]+/)) print substr($0, RSTART, RLENGTH) ' urls.txt
12345awk 'if (correspond ($ 0, / (?<=http:\/\/)[^\/]+/)) print substr($0, RSTART, RLENGTH) ' urls.txt

Ici, nous utilisons Lookahead (?<=) Pour correspondre à l'expression régulière «/ (?<=http://)[^/]+/" (qui correspond à tous les personnages qui viennent après "Http: //" Et avant le prochain "/" caractère) et extraire le nom de domaine.

4. Classes de personnages niés:

Disons que nous avons un fichier contenant une liste d'adresses e-mail, et que nous voulons extraire uniquement les adresses qui appartiennent à un domaine spécifique (E.g., exemple.com). Nous pouvons utiliser des classes de caractères niées pour accomplir cette tâche comme suit:

awk 'if (correspond ($ 0, / ^ [^ @] + @ exemple \.com $ /)) imprimer 0 'e-mails.SMS
12345awk 'if (correspond ($ 0, / ^ [^ @] + @ exemple \.com $ /)) imprimer 0 'e-mails.SMS

Ici, nous utilisons une classe de caractères niée ([^ @] +) Pour correspondre à tous les personnages qui ne sont pas "@" et extraire le nom d'utilisateur, puis assortir la chaîne littérale "@exemple.com » Pour s'assurer que l'adresse appartient au domaine spécifié.

5. Alternance:

Disons que nous avons un fichier contenant une liste de numéros de téléphone, et nous voulons extraire uniquement les numéros qui sont soit dans le format «(xxx) xxx-xxxx» ou «xxx-xxx-xxxx». Nous pouvons utiliser une alternance pour accomplir cette tâche comme suit:

awk 'if (match ($ 0, / \ ((\ d 3) \) (\ d 3) - (\ d 4) | (\ d 3) - (\ d 3 ) - (\ d 4) /)) imprimer substr ($ 0, rstart, rlength) 'Phones.SMS
12345awk 'if (match ($ 0, / \ ((\ d 3) \) (\ d 3) - (\ d 4) | (\ d 3) - (\ d 3 ) - (\ d 4) /)) imprimer substr ($ 0, rstart, rlength) 'Phones.SMS

Ici, nous utilisons l'alternance (|) Pour correspondre à l'expression régulière «/ (\ D3) (\ d3) (\ d 3) - (\ d 4) /» (qui correspond à un numéro de téléphone au format (xxx) xxx-xxxx) ou à l'expression régulière «/ (\ D 3) - (\ d 3) - (\ d 4) /» (qui correspond à un numéro de téléphone au format xxx-xxx-xxxx).

Conclusion

Les expressions régulières sont un outil puissant pour le traitement de texte dans AWK. Ils vous permettent de rechercher des modèles dans un fichier texte et de manipuler les données en fonction de ces modèles. En maîtrisant les expressions régulières dans AWK, vous pouvez devenir plus efficace et efficiente dans vos tâches de traitement de texte et accomplir facilement la manipulation des données complexes.