2013-04-27 7 views
22

Ich habe eine einfache Textdatei und ich brauche ein Powershell-Skript, um einige Teile des Dateiinhalts zu ersetzen.Ersetzen Sie den Inhalt einer Textdatei durch eine Regex in Powershell

Meine aktuelle Skript ist die folgende:

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

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

Ist es möglich, sie in einer Zeile ohne den Inhalt Variable zu schreiben, wie das?

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

Ich weiß nicht, wie ich die Ausgabe des ersten Get-Content Commandlet im zweiten Befehl ohne den $ content Variable verwenden kann? Gibt es eine automatische Powershell-Variable

Ist es möglich, mehr Ersetzungen zu tun als einer in einer Pipeline.

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

Antwort

37

Ja, Sie können, dass in einer Zeile tun und nicht einmal eine Pipeline benötigen, wie -replace Arbeiten auf Arrays, wie Sie es erwarten würde, zu tun (und Sie können die Kette den Operator):

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

(Zeilenumbrüche für Lesbarkeit hinzugefügt.)

die Klammern um den Get-Content Aufruf sind notwendig, um den -replace Operator wird als Argument an Get-Content interpretiert zu verhindern.

+0

Danke! Das ist, was ich will! –

+0

Obwohl es nur für eine Zeile nach der anderen funktioniert, wird "\" n "," b "-replace ('\ n', 'a')' 'a', 'b' zurückgeben. '\' n "," b "-replace ('\ nb', 'a')' Gibt immer noch "\' n "," b " –

+1

@TheRedPea zurück: Sie können es mit allen Zeilen auf einmal machen 'Get-Content-Raw' stattdessen. Sie erhalten dann eine einzelne Zeichenfolge zurück. – Joey

4

Ist es möglich, sie in einer Zeile ohne den Inhalt Variable zu schreiben, wie das?

Ja: Verwenden Sie ForEach-Object (oder sein Alias ​​%) und dann $_ das Objekt auf der Pipeline zu verweisen:

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

Ist es möglich, mehr als ein Ersatz in einer Pipeline zu tun.

Ja.

  1. Wie oben: nur weitere Foreach-Object Segmente hinzufügen.
  2. Als -replace gibt das Ergebnis, können sie in einem einzigen Ausdruck verkettet werden:

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

    ich die Klammern vermuten, dass nicht benötigt werden, aber ich denke, dass sie es leichter lesbar zu machen: mehr als ein paar deutlich verkettete Operatoren (besonders wenn die Übereinstimmung/Ersetzungen nicht-trivial sind) wird nicht klar sein.

+0

Ihre Lösung funktioniert nur mit den Klammern um den Get-Content-Befehl. (Get-Content-Pfad $ inputFile) | % {$ _ -Replace '"(\ d +), (\ d {1,})"', '$ 1. $ 2' -Replace '"(\ d +)"', '$ 1' - Ersetzen '_', ' '} | Out-File $ outputFile –

+2

@JanBaer Diese Klammern werden nur benötigt, wenn '$ InputFile' dasselbe ist wie '$ OutputFile'. – Richard

+0

Haben Sie Hinweise darauf, warum die Klammern das Schreiben in die Eingabedatei ermöglichen?Dies war genau der Anwendungsfall, den ich brauchte, aber ich finde es nicht offensichtlich. –

Verwandte Themen