2013-04-27 12 views
22

Ho un semplice file di testo e ho bisogno di uno script PowerShell per sostituire alcune parti del contenuto del file.Sostituire il contenuto di un file di testo con un'espressione regolare in powershell

mio script corrente è il seguente:

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

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

E 'possibile scrivere in una riga senza la variabile di contenuti, in questo modo?

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

non so come posso usare l'uscita del primo commandlet get-contenuti nel secondo comando senza la variabile $ content? Esiste una variabile PowerShell automatica

È possibile eseguire più sostituzioni di una in una pipeline.

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

risposta

37

Sì, è possibile farlo in una linea e non hanno nemmeno bisogno di un oleodotto, come -replace opere su array come ci si aspetterebbe che faccia (ed è possibile concatenare l'operatore):

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

(interruzioni di riga aggiunte per migliorare la leggibilità.)

le parentesi attorno alla chiamata Get-Content sono necessarie per evitare che l'operatore -replace essendo interpretato come argomento di Get-Content.

+0

Grazie! È quello che voglio! –

+0

Anche se funziona solo su una riga alla volta '" \ "n", "b" -replace ('\ n', 'a') 'restituirà 'a', 'b'. '" \ "n", "b" -replace ('\ nb', 'a') 'Restituisce ancora" \ 'n", "b" –

+1

@TheRedPea: puoi farlo con tutte le linee contemporaneamente usando 'Get-Content -Raw' invece. Quindi ottieni una singola stringa indietro. – Joey

4

E 'possibile scrivere in una riga senza la variabile di contenuti, in questo modo?

Sì: utilizzare ForEach-Object (o il suo alias %) e poi $_ per fare riferimento all'oggetto sul gasdotto:

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

E 'possibile fare più sostituti di uno su una pipeline.

Sì.

  1. Come sopra: solo aggiungendo più segmenti Foreach-Object.
  2. Come -replace restituisce il risultato, essi possono essere concatenati in una sola espressione:

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

    ho il sospetto le parentesi non sono necessarie, ma penso che lo rendono più facile da leggere: chiaramente più di qualche gli operatori incatenati (specialmente se le corrispondenze/sostituzioni non sono banali) non saranno chiari .

+0

La soluzione funziona solo con le parentesi attorno al comando Get-Content let. (Get-Content -path $ inputFile) | % {$ _ -Replace '"(\ d +), (\ d {1,})"', '$ 1. $ 2' -Replace '"(\ d +)"', '$ 1' -Replace '_', ' '} | Out-File $ outputFile –

+2

@JanBaer Queste parentesi sono necessarie solo se '$ InputFile' è uguale a' $ OutputFile'. – Richard

+0

Hai qualche riferimento sul perché le parentesi rendono possibile la scrittura sul file di input?Questo era esattamente il caso d'uso di cui avevo bisogno, ma lo trovo non ovvio. –

Problemi correlati