2017-07-24 6 views
1

ich auf einem Powershell-Skript arbeite und ich habe mehrere Textdateien, wo ich brauche Schrägstriche in den Zeilen zu ersetzen, die diesem Muster entspricht: .. >\\%name% .. < .. string (.. könnte etwas)alle Schrägstriche Wählen Sie zwischen zwei Zeichen

Beispiel von einer der Dateien, in denen die Schrägstriche sollte Spiel:

<Tag>\\%name%\TST$\Program\1.0\000\Program.msi</Tag> 

Beispiel Zeichenfolge von einer der Dateien, in denen die Schrägstriche sollte nicht Spiel:

<Tag>/i /L*V "%TST%\filename.log" /quiet /norestart</Tag> 

Bisher habe ich es geschafft, jedes Zeichen zwischen >\\%name% und < mit diesem Ausdruck (Regex101) wählen: (?<=>\\\\%name%)(.*)(?=<) aber ich nicht nur die Schrägstriche aus.

Gibt es eine Lösung, die ich noch nicht finden konnte?

+0

Ich bin nicht 100%, aber dies ist möglicherweise nicht in Regex möglich. Ihr Problem ähnelt der Frage (https://stackoverflow.com/questions/3200467/how-to-make-a-group-for-each-word-in-a-senttence). Ich sehe nicht, wie Sie jeden Backslash mit Gruppen mehrfach erfassen können, ohne den Text zwischen ihnen zu erfassen. –

Antwort

2

Ich würde empfehlen, die relevanten Tags mit einem XPath expression auswählen und dann ersetzen Sie den Textkörper der ausgewählten Knoten.

$xml.SelectNodes('//Tag[substring(., 1, 8) = "\\%name%"]' | ForEach-Object { 
    $_.'#text' = $_.'#text' -replace '\\', '\\' 
} 
+0

Dies hat mir geholfen, eine Lösung zu finden, danke! – Tinnitus

0

Also hier ist meine Lösung:

$original_file = $Filepath 
$destination_file = $Filepath + ".new" 

Get-Content -Path $original_file | ForEach-Object { 
    $line = $_ 
    if ($line -match '(?<=>\\\\%name%)(.*)(?=<)'){ 
     $line = $line -replace '\\','/' 
    } 
    $line 
} | Set-Content -Path $destination_file 
Remove-Item $original_file 
Rename-Item $destination_file.ToString() $original_file.ToString() 

so wird dies replace jeder \ mit einem/in dem gegebenen Muster, aber nicht in der Art und Weise, der meine Frage war.

Verwandte Themen