Comment utiliser PowerShell Replace pour remplacer du texte [Exemples]

Comme de nombreuses autres langues, PowerShell peut travailler avec des chaînes de caractères et du texte. Une de ces fonctionnalités utiles est d’utiliser PowerShell pour remplacer des caractères, des chaînes de caractères, voire même du texte à l’intérieur de fichiers.

Dans ce tutoriel, vous allez apprendre comment utiliser la méthode replace() de PowerShell et l’opérateur replace de PowerShell. Le tutoriel couvrira les bases et explorera même certaines expressions régulières « amusantes »!

Avant de commencer

Vous n’aurez pas besoin de grand-chose pour suivre tous les exemples de ce tutoriel ; vous aurez simplement besoin de PowerShell. Les exemples de ce tutoriel utiliseront PowerShell v7.0.2, mais tous les exemples devraient fonctionner dans Windows PowerShell.

Utilisation de PowerShell pour remplacer des chaînes : les bases

Un des cas les plus simples d’utilisation de PowerShell pour le remplacement consiste à remplacer des caractères dans des chaînes. Commençons par là avec quelques exemples.

Disons que vous avez une chaîne de caractères en PowerShell avec une valeur de hello, world.

$string = 'hello, world'

Vous souhaitez remplacer la chaîne hello, à l’intérieur de cette chaîne, par la chaîne hi pour que la variable $string ait une valeur de hi, world. Pour ce faire, PowerShell doit d’abord déterminer où se trouve le texte à « trouver ». Une fois trouvé, il remplace ce texte par une valeur définie par l’utilisateur.

Utilisation de la méthode Replace()

Une des façons les plus simples de remplacer des chaînes de caractères en PowerShell est d’utiliser la méthode de remplacement comme indiqué ci-dessous. La méthode replace() a deux arguments : la chaîne à rechercher et la chaîne avec laquelle remplacer le texte trouvé.

Comme vous pouvez le voir ci-dessous, PowerShell est en train de rechercher la chaîne hello et de remplacer cette chaîne par la chaîne hi. La méthode renvoie ensuite le résultat final qui est hi, world.

PS> $string.replace('hello','hi')
hi, world

Vous pouvez appeler la méthode de remplacement PowerShell sur n’importe quelle chaîne pour remplacer n’importe quelle chaîne littérale par une autre. Si la chaîne à remplacer n’est pas trouvée, la méthode replace() ne renvoie rien.

Vous n’avez pas besoin d’assigner une chaîne à une variable pour remplacer du texte dans une chaîne. Au lieu de cela, vous pouvez invoquer directement la méthode replace() sur la chaîne comme ceci : 'hello world'.replace('hello','hi'). Le tutoriel utilise une variable pour plus de commodité.

Suppression de caractères

Peut-être que vous voulez supprimer des caractères d’une chaîne plutôt que de les remplacer par autre chose. Vous pouvez le faire en spécifiant une chaîne vide.

PS> $string.replace('hello','')
, world

Remplacement de plusieurs occurrences

Vous avez maintenant le code pour remplacer une chaîne à l’intérieur d’une autre chaîne. Et pour remplacer plusieurs chaînes ? Pas de problème.

Étant donné que la méthode de remplacement PowerShell renvoie une chaîne, pour remplacer une autre occurrence, vous pouvez ajouter un autre appel de méthode replace() à la fin. PowerShell invoque ensuite la méthode replace() sur la sortie de l’original.

PS> $string.replace('hello','').replace('world','earth')
, earth

Vous pouvez enchaîner autant d’appels de méthode replace() que nécessaire, mais vous devriez envisager d’utiliser l’opérateur replace si vous avez beaucoup de chaînes à remplacer.

Utilisation de l’opérateur de remplacement PowerShell

Bien que l’utilisation de la méthode de chaîne de remplacement PowerShell soit la manière la plus simple de remplacer du texte, vous pouvez également utiliser l’opérateur replace de PowerShell. L’opérateur replace est similaire à la méthode en ce sens que vous fournissez une chaîne à trouver et à remplacer. Mais il a un gros avantage : la possibilité d’utiliser des expressions régulières (regex) pour trouver des chaînes correspondantes (plus tard).

En utilisant l’exemple ci-dessus, vous pouvez utiliser l’opérateur replace pour remplacer hello par hi de manière similaire à ce qui est montré ci-dessous. PowerShell effectue les mêmes étapes.

PS> $string -replace 'hello','hi'
hi, world

Suppression de caractères

Tout comme la méthode de remplacement PowerShell, vous pouvez également supprimer des caractères d’une chaîne en utilisant l’opérateur replace. Mais, contrairement à la méthode replace(), vous pouvez également exclure complètement la chaîne en tant qu’argument à remplacer et vous découvrirez le même effet.

PS> $string -replace 'hello',''
, world
PS> $string -replace 'hello'
, world

Remplacement de plusieurs occurrences

Tout comme la méthode replace(), vous pouvez également enchaîner les utilisations de l’opérateur replace. Puisque l’opérateur replace retourne une chaîne comme montré ci-dessous. Vous verrez dans la section suivante que votre code sera plus propre en utilisant regex.

PS> $string -replace 'hello','hi' -replace 'world','earth'
hi, earth

En utilisant PowerShell Regex Replace

Comme mentionné ci-dessus, le remplacement de chaînes dans la méthode de remplacement de PowerShell fonctionne mais il est limité. Vous êtes contraint d’utiliser uniquement des chaînes littérales. Vous ne pouvez pas utiliser de jokers ou d’expressions régulières. Si vous effectuez un remplacement intermédiaire ou avancé, vous devriez utiliser l’opérateur replace.

Disons que vous avez un script qui contient une chaîne créée avec une variable. Cette chaîne devrait être soit hello, world soit hi, world. Peut-être avez-vous eu une mauvaise journée en tant qu’administrateur système et que vous voulez changer la chaîne, quelle que soit sa valeur, en goodbye, world.

Vous avez besoin que hello, world et hi, world soient tous deux transformés en goodbye, world. Pour que cela se produise, vous devez utiliser une expression régulière. Vous pouvez faire correspondre à peu près n’importe quel modèle spécifique dans le texte avec regex.

Dans cet exemple, vous pouvez utiliser l’expression hello|hi pour faire correspondre les deux chaînes requises en utilisant l’expression régulière «ou» (|) caractère comme vous pouvez le voir ci-dessous.

PS> 'hello, world' -replace 'hello|hi','goodbye'
goodbye, world
PS> 'hi, world' -replace 'hello|hi','goodbye'   
goodbye, world

Une fois que vous avez appris à manier regex pour trouver des chaînes, vous pouvez utiliser PowerShell pour remplacer les chaînes de joker qui correspondent à n’importe quel modèle.

Échapper aux caractères Regex

Dans l’exemple regex ci-dessus, la chaîne à rechercher ne contenait aucun caractère spécial regex. Le langage d’expression régulière utilise certains caractères qui ne sont pas interprétés littéralement, contrairement à la plupart des lettres et chiffres.

Par exemple, peut-être que vous devez remplacer du texte dans une chaîne. Cette chaîne contient quelques caractères spéciaux regex tels qu’une parenthèse et un point d’interrogation. Vous essayez ensuite de remplacer la chaîne [hello] par goodbye comme indiqué ci-dessous.

PS> '[hello], world' -replace '[hello]','goodbye'
[goodbyegoodbyegoodbyegoodbyegoodbye], wgoodbyergoodbyed

Ce n’est clairement pas ce que vous aviez l’intention de faire. Ce scénario se produit lorsque vous utilisez des caractères spéciaux regex à l’intérieur de la chaîne à rechercher ([hello]).

Pour éviter ce problème, vous avez deux options. Vous pouvez soit échapper ces caractères spéciaux en préfixant un backslash devant chaque caractère, soit utiliser la méthode Escape().

Vous pouvez voir ci-dessous l’effet de l’échappement de chaque caractère spécial avec un backslash.

PS> '[hello], world' -replace '\[hello\]','goodbye'
goodbye, world

En alternative, et recommandé, vous pouvez utiliser la méthode Escape() du type regex pour supprimer automatiquement tous les caractères spéciaux.

PS> '[hello], world' -replace ([regex]::Escape('[hello]')),'goodbye'
goodbye, world

Il est préférable d’utiliser la méthode Escape() lorsque c’est possible, car elle échappe à tous les caractères spéciaux, évitant ainsi de les mémoriser.

Utilisation des groupes de correspondance/capture.

Dans tous les exemples précédents, ce tutoriel a utilisé une chaîne littérale pour remplacer une autre chaîne. Vous avez utilisé hi ou goodbye. Mais que se passe-t-il si vous voulez utiliser un ou plusieurs caractères que PowerShell a trouvés dans la chaîne à remplacer ? Vous devrez faire correspondre ou capturer des groupes.

Regex a un concept appelé groupes de capture et de références arrière. Les groupes de capture vous permettent de capturer des chaînes pour les référencer ailleurs. PowerShell tire parti de cette fonctionnalité en utilisant des groupes de correspondance avec l’opérateur replace.

Par exemple, peut-être avez-vous une chaîne qui pourrait contenir quelques valeurs différentes.

'hello world, you sexy beast'
'hi world, now go away'
'hello earth, you are lovely today'

Vous aimeriez échanger la première partie de la chaîne avec la seconde partie pour qu’elles ressemblent à ceci :

'you sexy beast,hello world'
'now go away,hi world'
'you are lovely today,hello earth'

Pour effectuer cette action, PowerShell doit trouver tout le texte à droite et à gauche de la virgule. Une fois qu’il sait quel est ce texte, il doit alors remplacer l’un par l’autre. Pour cela, vous avez besoin de références arrière.

A backreference is a regex variable (not a PowerShell variable) that represents the text that regex matched. Backreferences in PowerShell are represented with a dollar sign followed by a number indicating the order in which they were matched.

Vous pouvez voir un exemple ci-dessous.

## Cette chaîne pourrait aussi être :
## 'hi, world, maintenant va-t-en'
## 'bonjour, terre, tu es charmante aujourd'hui'
PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(.*), (.*)','$2,$1'
you sexy beast,hello world

Dans l’exemple ci-dessus, vous pouvez voir des groupes de capture regex encadrant chaque correspondance (hello world) et (you sexy beast) avec des parenthèses. Ensuite, pour le remplacement, hello word a été d’abord trouvé de gauche à droite, donc il obtient une étiquette de référence arrière $1 et you sexy beast obtient une étiquette de référence arrière $2.

Une fois que PowerShell connaît la valeur de chaque correspondance, vous pouvez utiliser ces références dans le texte remplacé de la manière que vous souhaitez. Dans cet exemple, $2,$1 échange leurs positions.

Utilisation de groupes de correspondance nommés

Si vous ne souhaitez pas utiliser de placeholders numériques tels que $1, $2 pour référencer les valeurs de correspondance, vous pouvez également utiliser des labels ou des noms. Au lieu de devoir compter de gauche à droite quelles références signifient quoi, vous pouvez simplement utiliser des noms.

Pour utiliser des noms comme références, vous devez d’abord définir des labels pour chaque correspondance dans la chaîne de correspondance. Pour ce faire, vous devez définir le groupe de capture comme (?<label><regex>)label est le nom et <regex> est l’expression régulière que vous utilisez.

Une fois que vous avez défini les noms, vous pouvez les référencer dans la chaîne de remplacement en utilisant un signe dollar et en encadrant le nom entre crochets, par exemple ${label}.

Vous pouvez voir une démonstration de cette technique ci-dessous.

PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(?<First_Part>.*), (?<Second_Part>.*)','${Second_Part},${First_Part}'
you sexy beast,hello, world

Conclusion

Comme vous l’avez appris, l’opérateur de remplacement PowerShell vous permet de remplacer des caractères, du texte et des chaînes de nombreuses manières différentes. Pour effectuer des remplacements simples, vous pouvez utiliser la méthode replace(), mais si vous avez besoin de faire correspondre et de remplacer quelque chose de plus avancé, utilisez toujours l’opérateur replace.

Source:
https://adamtheautomator.com/powershell-replace/