Kürzlich habe ich ein kleines Powershell-Skript geschrieben, dass den Inhalt einer XML-Datei anpassen soll, bevor dieser von einem anderen Programm weiterverarbeitet wird. Im Prinzip soll das ganze nichts wildes machen, sondern lediglich einige Begriffe ersetzen, die im Programm aus dem es exportiert wird nicht veränderbar sind. Dabei muss man allerdings auf das Escaping achten.
Folgender Replace-Befehl funktioniert ohne Probleme und ersetzt in jeder Zeile der Quelldatei die Fundstelle „1234“ durch „5678“ und überschreibt am Ende die Quelldatei:
1 2 3 |
(Get-Content D:\test.xml) | Foreach-Object {$_ -replace '1234','5678'} | Set-Content D:\test.xml |
Problematisch wurde es diesmal, da ich folgenden Befehl nutzen wollte:
1 |
Foreach-Object {$_ -replace '(Bla)','Bla'} |
Dies funktioniert aber nicht, ebenso wenig wie auf diese Weise:
1 |
Foreach-Object {$_ -replace "(Bla)","Bla"} |
Die Klammern werden nicht ersetzt, lediglich der Inhalt zwischen den Klammern. Über das Escaping in Powershell habe ich mir gar keine großen Gedanken gemacht, da ich bisher anscheinend keine Sonderzeichen in Powershell ersetzen musste.
Die runden Klammern müssen lediglich wie folgt innerhalb eckiger Klammern eingeschlossen werden um das gewünschte Ergebnis zu erzielen:
1 |
Foreach-Object {$_ -replace "[(]Bla[)]","Bla"} |