2016-12-01 2 views
0

Mit Powershell Version 3 & Lesen des Inhalts einer Datei, die ich dann sehen muss, wenn ich eine von mehreren Zeichenfolgen, die in der Datei enthalten sind, und ersetzen sie, wenn sie sind. Das Problem in meinem Fall ist, dass eine der Zeichenfolgen, auf die ich mich anpassen muss, eine variable Anzahl von Leerzeichen (oder gar keine Leerzeichen) enthalten kann.Powershell - passend zu einer Zeichenkette, die Leerzeichen enthalten könnte

Die Zeichenfolge, nach der ich suche, enthält doppelte Anführungszeichen, gefolgt von einem Doppelpunkt (:), Whitespace (oder keiner) und einer beliebigen Anzahl von Status (entweder alphanumerisch oder numerisch) gefolgt von einem Komma . Der Einfachheit halber verwende ich nur eine Nummer im folgenden Code.

$txt = (Get-Content $file) 
$oldstr = "`"status`": 1," 
$newstr = '`"status`": 0," 
if (($txt.Contains($old1)) -or ($txt.Contains($oldstr)) -or ($txt.Contains($old2))) { 
    $txt.Replace($oldstr, $newstr).Replace($old1, $new1).replace($old2, $new2)| Set-Content -Path $file 
} 

Das Problem, das ich habe, ist die $oldstr passend, die keine haben, ein oder mehr Leerzeichen zwischen dem Doppelpunkt und dem Statuscode, der in diesem Beispiel eine Zahl, aber es kann auch mehr verschiedenen Zahlen oder Saiten. Das $newstr muss das Leerzeichen aus dem $oldstr nicht replizieren. Auch im obigen Beispiel verwendet es eine der drei Bedingungen in den Contains. Die tatsächlichen Daten können keine, eine, zwei oder alle drei dieser Zeichenfolgen enthalten.

Wie können Sie die Übereinstimmung/contains und das Ersetzen der Zeichenfolgen, die Leerzeichen in ihnen haben können, tun?

+0

gut bilden, würden Sie regex müssen, das zu tun;) aber ich kann Ihnen nicht helfen;) – 4c74356b41

Antwort

2

Verwenden Sie einen regulären Ausdruck mit dem -replace Operator:

PS C:\> '"status":  0' -replace '"status":\s*0','"status": 1' 
"status": 1 
PS C:\> '"status": 0' -replace '"status":\s*0','"status": 1' 
"status": 1 
PS C:\> '"status":0' -replace '"status":\s*0','"status": 1' 
"status": 1 

In dem Muster I oben verwenden:

  • "status": entspricht nur dem Literalzeichenfolge "status":
  • \s* Matches 0 oder mehr Leerzeichen
  • 0 Übereinstimmungen ein Literal 0
1

Here is an interessant solution auf mehr Spiel aufweist/ersetzen Paare mit einer Hash-Tabelle in eine kombinierte regex umgewandelt. Aber ich habe keine Regex in den Hash-Schlüssel bekommen, also mache ich sowohl die Tabelle als auch eine RegEx zum $ _ in der Foreach.

# Build hashtable of search and replace values. 

$file = ".\testfile.txt" 

$replacements = @{ 
    'something2' = 'somethingelse2' 
    'something3' = 'somethingelse3' 
    'morethings' = 'morethingelses' 
    'blabla' = 'blubbblubb' 
} 
# Join all keys from the hashtable into one regular expression. 
[regex]$r = @($replacements.Keys | foreach { [regex]::Escape($_) }) -join '|' 

[scriptblock]$matchEval = { param([Text.RegularExpressions.Match]$matchInfo) 
    # Return replacement value for each matched value. 
    $matchedValue = $matchInfo.Groups[0].Value 
    $replacements[$matchedValue] 
} 
$fileCont = Get-Content $file 
# Perform replace over every line in the file and append to log. 
$Newfile = $fileCont | ForEach { 
    $r.Replace(($_ -replace '"status":\s*0','"status": 1'), $matchEval) 
} 

$fileCont 
"----" 
$Newfile 

Gibt dieser Ausgang meine testfile.txt

> .\Replace-Array.ps1 
"Status": 0, something2,morethings 
"Status": 0, something3, blabla 
---- 
"status": 1, somethingelse2,morethingelses 
"status": 1, somethingelse3, blubbblubb 
Verwandte Themen