2016-07-26 11 views
-1

Ich versuche zu suchen und in Powershell mehrere XML-Dateien rekursiv zu ersetzen. Ich möchte vermeiden, dass das Skript bestimmte Anpassungen passender Texte ersetzt.Bedingte Regex in Powershell suchen und ersetzen

Zum Beispiel, wenn Sie die folgenden XML-Beispiel

nehmen
<title>this is a web-site</title> 
<subtitle>web-site experience</subtitle> 
<path>c:/web-site/web-site.xml</path> 
</doc> 

sollte als unten nach dem Skript

<title>this is a new-site</title> 
<subtitle>new-site experience</subtitle> 
<path>c:/web-site/web-site.xml</path> 
</doc> 

, wenn Sie die oben i die Zeichenfolge/web- ignorieren wollen sehen, geändert werden Website/und/Website.

Ich versuche, einen OR-Operator zu verwenden und ignorieren und durch den folgenden Code ersetzen, aber es scheint nicht zu helfen.

$content -replace '(^|[^/])web-site([^/]|$)|(^|[^/])web-site([^.]|$)', '$1new-Site$2' | 
     Out-File $file.FullName -Encoding utf8 

Können Sie mir mitteilen, wie bedingte zu verwenden oder für mehrere Bedingungen

+0

Sie sollten wahrscheinlich den XML-Knoten mit e auswählen. G. xpath und dann den Inhalt ändern? –

+0

Ich weiß nicht, ob ich dich richtig verstehe. Da es xml-Dokument ist - möchten Sie nur andere Knoten als Titel ignorieren? –

+0

Dies ist nur eine kleine Variation Ihrer vorherigen Frage. –

Antwort

0

Da es XML ist, schlage ich vor, diese Dateien wie XML zu analysieren. Schauen Sie sich folgendes Snippet an:

$xml = [xml]"<doc> 
<title>this is a web-site 1</title> 
<title>this is a web-site 2</title> 
<subtitle>web-site experience</subtitle> 
<path>c:/web-site/web-site.xml</path> 
</doc>" 
$xml.doc.SelectNodes("title") | % { $_.InnerText = $_.InnerText.Replace("web-site", "new-site") } 
$xml.doc.title 
+0

Leider kann ich nicht mit Knoten syntaktisch analysieren, da es viele verschiedene Knoten gibt, wo diese übereinstimmen können. Also suchte ich nach einer Regex wie oben – user2628187