Remplacer le contenu d'un fichier texte par un regex 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,})"', '.' |  Out-File "output.json"

est-il possible de l'écrire en une seule ligne sans la variable content, comme ceci?

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

Je ne sais pas comment je peux utiliser la sortie du premier commandlet get-content dans la deuxième commande sans la variable $content? Y a-t-il une variable powershell automatique

est-ce possible? faire plusieurs remplacements dans un pipeline.

Get-Content -path "Input.json" | ??? -Replace '"(d+),(d{1,})"', '.' | ??? -Replace 'second regex', 'second replacement' |  Out-File "output.json"
23
demandé sur Martin Ender 2013-04-27 13:04:39

2 réponses

Oui, vous pouvez le faire en une seule ligne et de ne même pas besoin d'un pipeline, comme -replace fonctionne sur des tableaux comme vous vous attendez à ce qu'il fasse (et vous pouvez enchaîner l'opérateur):

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

(les sauts de ligne sont ajoutés pour plus de lisibilité.)

les parenthèses autour du Get-Content les appels sont nécessaires pour empêcher le -replace l'opérateur étant interprété comme un argument à Get-Content.

42
répondu Joey 2013-04-28 09:07:31

est-il possible de l'écrire en une seule ligne sans la variable content, comme ceci?

Oui: utiliser ForEach-Object (ou son alias %) et $_ pour faire référence à l'objet sur le pipeline:

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

Est-il possible d'effectuer plusieurs remplacements dans un pipeline.

Oui.

  1. comme ci-dessus: il suffit d'ajouter plus Foreach-Object segments.
  2. -replace renvoie le résultat, ils peut être enchaîné dans 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'ils sont plus faciles à lire: clairement plus de quelques opérateurs enchaînés (surtout si le match / remplacements ne sont pas anodins) ne pas être clair.

6
répondu Richard 2013-04-27 10:11:33