2016-07-22 128 views
1

我使用PowerShell遞歸地替換XML文件中的文本。該腳本在替換中工作正常。但是,XML文件也具有不應該被替換的文件路徑。這是劇本目前正在使用XML文件中的條件替換

if ($content -match ' web site | web-site ') { 
    $content -replace ' web site ',' New Site ' -replace ' web-site ',' New Site ' | 
     Out-File $file.FullName -Encoding utf8 

例如,如果XML文件有

<title>web site</title> 
<subtitle>web-site</subtitle> 
<path>c:/web site/website.xml</path> 

預期的輸出應該如下。文件路徑中的匹配文本應該被忽略。如何添加一個條件來忽略該字符串,如果它在/web site//web-site.xml之間?

<title>New Site</title> 
<subtitle>New Site</subtitle> 
<path>c:/web site/website.xml</path> 

回答

0

這裏有一個速戰速決,但請注意,一個更強大的解決方案將使用PowerShell的XML解析功能:看Ansgar Wiecher's helpful answer

注:
- 這個回答假設的琴絃興趣不與XML文檔的語法元素相沖突,例如元素名稱和屬性名稱(這恰好適用於特定字符串),這說明了爲什麼使用真正的XML解析器是更好的選擇。

$content = @' 
<doc> 
<title>web site</title> 
<subtitle>web-site</subtitle> 
<path>c:/web site/website.xml</path> 
</doc> 
'@ 

$modifiedContent = $content -replace '(^|[^/])web[ -]site([^/]|$)', '$1New Site$2' 
# Replace 'web site' and 'web-site' if not preceded or followed by a '/'. 
# Note: `web[ -]site` is the equivalent of `web site|web-site` 

if ($modifiedContent -cne $content) { # If contents have changed, save. 
    Out-File -InputObject $modifiedContent $file.FullName -Encoding utf8 
} 
+0

@Ansgar和mklement有出現在那裏將與前文太喜歡後有空格'新網站'這就是爲什麼我想知道是否有任何快速修復忽略/文本/任何正則表達式。是否有任何quickfix的狐狸爲此,或者你可以給我一個領導來處理這個XML解析 – user2628187

+0

@ user2628187:請參閱我的更新。 Ansgar的回答專門針對'title'和'subtitle'元素,所以我希望它能夠按原樣運行(除非你不想使用明確的元素名稱列表)。 – mklement0

4

它通常是更爲有效和很不容易出錯來處理XML作爲XML。選擇要更新的節點,然後將修改的數據保存迴文件。

$filename = 'C:\path\to\your.xml' 

[xml]$xml = Get-Content $filename 
$xml.SelectNodes('//*[self::title or self::subtitle]') | 
    Where-Object { $_.'#text' -match 'web.site' } | 
    ForEach-Object { $_.'#text' = 'New Site' } 
$xml.Save($filename) 

如果您需要修改節點文本串,你可以做這樣的事情:

$filename = 'C:\path\to\your.xml' 

[xml]$xml = Get-Content $filename 
$xml.SelectNodes('//*[self::title or self::subtitle]') | 
    Where-Object { $_.'#text' -match 'web.site' } | 
    ForEach-Object { $_.'#text' = $_.'#text' -replace 'web.site', 'New Site' } 
$xml.Save($filename) 
+1

做得很好;我建議使用'-match'web [ - ] site''來更加精確地匹配OP的代碼;你有使用'self ::'的特殊原因嗎?似乎沒有它工作正常。 – mklement0

+1

我還沒有意識到它的工作原理沒有'self'軸。 –

+0

是的,但問題是文件路徑可能出現在許多不同的xml標記中,因此無法使用此選項。你知道我們是否可以用正則表達式的形式指定前一個和最後一個文本,比如前/後的slach/web site/ – user2628187