Verwenden von Powershell zum ersetzen Unterabschnitt regex-Ergebnis

Mithilfe von Powershell, weiß ich, wie um eine Datei zu suchen, die für einen komplizierten string mit einem regex, und ersetzen Sie ihn durch einen festen Wert, wie im folgenden Codeausschnitt gezeigt:

Get-ChildItem  "*.txt" |
Foreach-Object {
    $c = ($_ | Get-Content)
    $c = $c -replace $regexA,'NewText'
    [IO.File]::WriteAllText($_.FullName, ($c -join "`r`n"))
}

Nun bin ich versucht, herauszufinden, wie zu ersetzen Unterabschnitt jedes match in regex. Kann das getan werden, mit einer gleichmäßigen Schritt wie oben? Oder haben Sie zu extrahieren jedes match von den größeren regex-suchen-und-ersetzen, und dann irgendwie kleben, das Ergebnis wieder in den ursprünglichen text?

Um mit einem Beispiel verdeutlichen: angenommen, die im folgenden test text möchte ich nur 14xx-nummerierte Instanzen wie "TEST=*1404" in den folgenden text, und ersetzen Sie die 14xx mit 16xx?

A 2180 1830 12 0 3 3 TEST=C1404
A 900 1830 12 0 3 3 TEST=R1413
A 400 1830 12 0 3 3 TEST=R1411
A 1090 1970 12 0 3 3 TEST=U1400
A 1090 1970 12 0 3 3 TEST=CSA1400
A 1090 1970 12 0 3 3 TEST=CSA1414
A 1090 1970 12 0 3 3 TEST=CSA140
A 1090 1970 12 0 3 3 TEST=CSA14001
A 1090 1970 12 0 3 3 TEST=CSA17001

I. e. Ich möchte die resultierende text, wie folgt, wo Sie ' ll beachten Sie, dass nur die ersten 6 Zeilen ändern sollte:

A 2180 1830 12 0 3 3 TEST=C1604
A 900 1830 12 0 3 3 TEST=R1613
A 400 1830 12 0 3 3 TEST=R1611
A 1090 1970 12 0 3 3 TEST=U1600
A 1090 1970 12 0 3 3 TEST=CSA1600
A 1090 1970 12 0 3 3 TEST=CSA1614 <- Second instance of '14' shouldn't change
A 1090 1970 12 0 3 3 TEST=CSA140 <- Shorter numbers shouldn't change
A 1090 1970 12 0 3 3 TEST=CSA14001 <- Longer numbers shouldn't change
A 1090 1970 12 0 3 3 TEST=CSA17001

Folgende regex zu tun scheint, den job zu finden, die grössere strings, wo ich brauche, um Ersatz, aber ich weiß nicht welche Funktionen in der Powershell (replace?) zu verwenden, um zu ersetzen Sie einfach den substring der Ergebnisse. Auch, zögern Sie vorschlagen, eine bessere regex, wenn das helfen würde.

$regexA = "\bTEST=\b[A-Za-z]+14\d\d\r"

Ich würde es lieber nicht zu " hard-code eine erschöpfende Liste der Dinge, die kommen kann, zwischen dem '=' und die zahlen, wie 'R', 'C', "CSA", etc.

Ich gearbeitet habe, etwas für eine Stunde oder so, wo ich die ganzen Spiele für die regex-Suche in Ihnen zu ersetzen, die 14, mit 16, dann ausführen, ersetzen Sie den ursprünglichen text mit dem alten und neuen Werten, z.B. replace($myText,"TEST=CSA1400","TEST=CSA1600"), aber das ist nicht die Abdeckung aus dem speziellen Fällen sehr gut, und es fühlt sich an wie ich bin überschrift unten die Kaninchen-Loch.

InformationsquelleAutor SSilk | 2013-11-11
Schreibe einen Kommentar