web-dev-qa-db-fra.com

Remplacer le contenu d'un fichier texte par une expression régulière dans PowerShell

J'ai un simple fichier texte et j'ai besoin d'un script PowerShell pour remplacer certaines parties du contenu du fichier.

Mon script actuel est le suivant:

$content = Get-Content -path "Input.json"

$content -Replace '"(\d+),(\d{1,})"', '$1.$2' |  Out-File "output.json"

Est-il possible de l'écrire sur une seule ligne sans la variable de contenu, comme ceci?

Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' |  Out-File "output.json"

Je ne sais pas comment utiliser la sortie de la première commande get-content dans la deuxième commande sans la variable $ content? Existe-t-il une variable PowerShell automatique

Est-il possible de faire plus de remplacements qu'un dans un pipeline.

Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | ??? -Replace 'second regex', 'second replacement' |  Out-File "output.json"
35
Jan Baer

Oui, vous pouvez le faire sur une seule ligne et n'avez même pas besoin d'un pipeline, comme -replace fonctionne sur des tableaux comme vous vous y attendez (et vous pouvez chaîner l'opérateur):

(Get-Content Input.json) `
    -replace '"(\d+),(\d{1,})"', '$1.$2' `
    -replace 'second regex', 'second replacement' |
  Out-File output.json

(Des sauts de ligne ont été ajoutés pour plus de lisibilité.)

Les parenthèses autour du Get-Content un appel est nécessaire pour empêcher le -replace opérateur étant interprété comme un argument pour Get-Content.

52
Joey

Est-il possible de l'écrire sur une seule ligne sans la variable de contenu, comme ceci?

Oui: utilisez ForEach-Object (ou son alias %) puis $_ pour référencer l'objet sur le pipeline:

Get-Content -path "Input.json" | % { $_ -Replace '"(\d+),(\d{1,})"', '$1.$2' } |  Out-File "output.json"

Est-il possible de faire plus de remplacements qu'un dans un pipeline.

Oui.

  1. Comme ci-dessus: ajouter simplement plus de Foreach-Object segments.
  2. Comme -replace renvoie le résultat, ils peuvent être chaînés en une seule expression:

    ($_ -replace $a,$b) -replace $c,$d
    

    Je soupçonne que les parenthèses ne sont pas nécessaires, mais je pense qu'elles facilitent la lecture: clairement plus de quelques opérateurs chaînés (surtout si la correspondance/les remplacements ne sont pas triviaux) ne seront pas clairs.

10
Richard