maciek905 - Fotolia

Administration : comment utiliser les RegEx dans PowerShell

Une expression régulière est une série de caractères qui détermine un modèle de texte à trouver, soit pour extraire une donnée d’un fichier, soit pour valider la saisie d’un utilisateur. Cet article montre comment en tirer parti en PowerShell.

Essayer de trouver des informations spécifiques dans un texte ou détecter une saisie particulière dans un script interactif peut vite devenir un cauchemar. Heureusement, il existe un moyen de simplifier ce processus : les expressions régulières, alias RegEx.

Les RegEx sont constituées d’une séquence de caractères qui définit le modèle du texte à détecter. Par exemple, les expressions régulières sont couramment utilisées pour valider que les données saisies sont au bon format ou pour localiser des informations spécifiques dans une longue chaîne de texte. Les expressions régulières peuvent également être utilisées pour manipuler des chaînes de caractères.

Les expressions régulières ne sont pas spécifiques à PowerShell. La plupart des langages de programmation modernes prennent en charge de manière native l’utilisation d’expressions régulières.

Les expressions régulières peuvent être complexes. Une discussion exhaustive de la syntaxe des expressions régulières dépasse le cadre de cet article, mais certains des éléments les plus couramment utilisés sont les suivants :

  • L’astérisque ( * )  est un caractère de remplacement ; il représente n’importe quel caractère individuel.
  • Les crochets ( [] ) indiquent qu’un caractère doit correspondre à l’un des caractères entre crochets. Par exemple [abc] indique que le caractère doit être A, B ou C.
  • Le symbole exposant entre crochets ( [^] ) fonctionne à l’inverse des caractères entre crochets normaux. L’exposant indique qu’un caractère ne peut correspondre à aucun des caractères entre crochets. Si vous validiez une entrée et vouliez vous assurer que les lettres A, B ou C n’ont pas été saisies, vous pourriez utiliser [^abc].

Comment extraire des données ?

Dans un script PowerShell, les expressions régulières vous permettent de localiser et d’extraire des données. Par exemple, vous pouvez créer un script qui localise des données spécifiques dans un fichier log ou qui extrait des informations d’une page web.

À titre d’exemple, imaginons un fichier texte appelé SampleParagraph.txt, qui contient le nom et les coordonnées de l’auteur de cet article, ainsi que les premiers paragraphes de cet article (en anglais) tels qu’ils ont été initialement rédigés pour le site SearchIToperations, partenaire américain du MagIT.

Il est facile de créer un script PowerShell qui lit un fichier texte et y recherche une chaîne de caractères – ci-dessous, une adresse électronique. Il n’est même pas nécessaire d’utiliser des expressions régulières pour accomplir cette tâche. Vous pouvez localiser une adresse électronique spécifique à l’aide de cette commande :

Select-String -Path SampleParagraph.txt -Pattern '<email address>'

Si vous regardez la figure 1, vous pouvez voir que cette commande a localisé l’adresse e-mail dans la deuxième ligne du fichier.

Recherche dans un fichier texte à l'aide de la commande Select-String.
Figure 1. Utiliser la commande Select-String pour effectuer une recherche dans un fichier texte.

Les expressions régulières sont surtout utiles dans les situations où vous ne connaissez pas le texte exact que vous devez extraire. Par exemple, nous cherchons si le texte contient une adresse e-mail, mais nous ne savons pas de quelle adresse e-mail il s’agit.

Les adresses e-mail respectent un format spécifique. Elles contiennent un bout de texte, un signe @, un autre bout de texte, un point et un nom de domaine de premier niveau. Ce formatage standardisé permet de localiser une adresse e-mail dans un fichier, même si l’on ne sait pas exactement laquelle. Voici une commande que vous pouvez utiliser :

Select-String -Path SampleParagraph.txt -Pattern '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b'

Comme vous pouvez le constater, la première partie de la commande est identique à celle utilisée précédemment. La différence est qu’au lieu de rechercher une valeur littérale, nous recherchons un motif. Bien que le motif ait l’air énigmatique, il a une signification.

Le \b qui vient au début du motif indique à PowerShell que la correspondance est à chercher à l’extrémité d’un mot (à son début ou à sa fin).

La partie suivante du motif, [A-Za-z0-9._%+-]+, indique à PowerShell que la première partie de l’adresse électronique peut contenir des lettres majuscules ou minuscules, des chiffres ou quelques symboles différents. Comme vous vous en souvenez peut-être, ce type de filtrage s’applique normalement à un seul caractère. Toutefois, le signe + à la fin de cette partie de l’expression indique qu’une correspondance peut contenir un ou plusieurs caractères.

Ensuite, le motif comprend un symbole @, qui correspond au signe @ dans une adresse e-mail, puis un autre motif identique à celui utilisé pour la première partie de l’adresse.

La dernière partie du motif est "\.[A-Za-z]{2,}\b". Cela indique à PowerShell que la chaîne de texte recherchée (l’adresse e-mail) doit se terminer par un point, deux caractères ou plus et la fin d’un mot. La raison pour laquelle nous recherchons deux caractères ou plus est que certaines adresses électroniques utilisent des noms de domaine de premier niveau à trois caractères, tels que .com, .gov ou .edu, tandis que d’autres utilisent deux caractères, tels que .fr ou .be.

Le fait de demander à PowerShell de rechercher au moins deux caractères permet au modèle de recherche de trouver des adresses électroniques avec l’un ou l’autre type de nom de domaine de premier niveau.

PowerShell peut trouver une adresse électronique à l'aide d'une RegEx.
Figure 2. PowerShell peut trouver une adresse électronique à l'aide d'une RegEx.

Comment valider une saisie lors d’un script interactif ?

Vous pouvez également utiliser les expressions régulières comme outil de validation des saisies. Supposons que vous ayez créé un script PowerShell qui demande à l’utilisateur de saisir une adresse e-mail. Vous pouvez utiliser la correspondance des expressions régulières pour déterminer si la saisie de l’utilisateur respecte le format utilisé pour les adresses e-mail. Voici à quoi pourrait ressembler un tel script :

$Email=Read-Host "Please enter an email address"

If ($Email -Match '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}')
{
Write-Host "This looks like an email address"
}
Else {
Write-Host "Invalid Email Address"
}
Utiliser une expression régulière pour valider la saisie.
Figure 3. Utilisez une expression régulière pour valider la saisie.

Comment manipuler des chaînes de caractères ?

Tout comme vous pouvez utiliser les expressions régulières pour valider les chaînes de caractères, vous pouvez également les utiliser pour les manipuler. Les utilisations de la manipulation de chaînes sont innombrables. Pensez à la façon dont vous pourriez utiliser la manipulation de chaînes en conjonction avec la validation des entrées. Dans certains cas, si vous détectez une entrée non valide, vous pouvez utiliser la manipulation de chaînes pour la corriger automatiquement.

Par exemple, le prénom de l’auteur de cet article a une orthographe quelque peu inhabituelle : Brien, au lieu de Brian. Comme vous pouvez l’imaginer, ce nom est souvent mal orthographié. Les deux fautes d’orthographe les plus courantes sont Brian et Brain. Voici un script PowerShell simple qui vérifie ces deux fautes d’orthographe et les corrige :

$Name=Read-Host "Please type Posey's first name"
If ($Name -Match "Br[ia][ia]n")
     {
     $Name='Brien'
     Write-Host "The name's spelling has been corrected to " $Name
     }

Else
     {
     Write-Host "The name was spelled correctly"
     }
Le script valide les entrées et les corrige si nécessaire.
Figure 4. Le script valide les entrées et les corrige si nécessaire.

Ce script demande à l’utilisateur de taper le prénom de l’auteur de cet article. Le texte qu’il a saisi est stocké dans une variable appelée $Name. Le script effectue ensuite une recherche de motifs pour détecter les caractères non valides à la troisième et quatrième position. Plus précisément, le script recherche les lettres I et A à des positions où elles n’ont pas leur place. Si une faute d’orthographe est détectée, elle est corrigée automatiquement.

Cette approche peut s’avérer utile lorsqu’un utilisateur doit saisir un numéro de produit dans un script PowerShell. Si vous savez que le numéro de produit commence toujours par la lettre P, vous pouvez valider l’entrée, puis utiliser la technique que je viens de démontrer pour remplacer un caractère de départ invalide.

Pour approfondir sur Administration de systèmes