2013-03-08 29 views
2

我使用下面的管道讀取文件並替換它中的一行並將其保存到另一個文件,但發現目標文件中的字符串未被替換,它是仍然是舊的。使用PowerShell的ForEach對象來匹配和替換字符串與正則表達式

原線是:名稱1a2b3c4d

新行應爲:名稱6a5e4r3h

(Get-Content "test1.xml") | ForEach-Object {$_ -replace '^name-.*$', "name-6a5e4r3h"} | Set-Content "test2.xml" 

遺漏呢?

+0

您的代碼在PS2.0和PS3.0上完美工作 – 2013-03-08 09:25:21

+0

您是否嘗試過使用XML解析?不知道這是否適用,但如果您知道XML的哪些元素需要替換字符串,那可能是「更乾淨」 – Poorkenny 2013-03-08 10:15:55

回答

1

您沒有更改$ _變量。

您可以試試:

你錯過
$lines = Get-Content $file 
$len = $lines.count 
for($i=0;$i-lt$len;$i++){ 
    $lines[$i] = $lines[$i] -replace $bad, $good 
} 
$lines > $outfile 
+0

謝謝。但是不替換和管道導致字符串替換?如果我想用原始方式如何更改$ _? – user1201530 2013-03-08 09:24:30

+0

我也試過不使用正則表達式,但固定字符串,它的工作原理。如下面的 (Get-Content「test1.xml」)| ForEach-Object {$ _ -replace'name-1a2b3c4d',「name-6a5e4r3h」} | Set-Content「test2.xml」 – user1201530 2013-03-08 09:25:09

+1

@ user1201530「-replace」的第一個參數總是一個正則表達式。當你使用''name-1a2b3c4d''時,你正在省略'^'(在行首)和$'(在行尾)。也許在你的原始文件中'name-1a2b3c4d'與'^'不匹配。 – 2013-03-08 09:38:05

5

的一件事是,-replace運算工作得很好的數組,這意味着你不需要這樣的foreach循環對象在所有上:

(Get-Content "test1.xml") -replace '^name-.*$', 'name-6a5e4r3h' | Set-Content test2.xml 
相關問題