2012-06-28 38 views
1

我正在做一些數據的正則表達式,如果$ _在「替換」部分,我也會得到內容。我已經嘗試了各種各樣的替換,但似乎無法阻止這種行爲。我也嘗試過[正則表達式] :: escape(),但是最終做同樣的事情,只是使用轉義字符。PowerShell可能的錯誤取代,或者我做錯了嗎?

我需要能夠容忍替換中的$ _。我可以做一些其他的事情,稍後做一些修正,但這很醜陋,我寧願避免它。

最後如果$ replace ='$ anythingelse'它看起來像預期的那樣工作,只有$ _似乎會導致這個問題。如果所有解析都可以被禁用,那也可以。

腳本:

$contents = 'foo' 
$replace = '$_ bar' 
$final = $contents -replace 'oo', $replace 
Write-Output "Contents: $contents" 
Write-Output "Replace: $replace" 
Write-Output "Final: $final" 

輸出:

Contents: foo 
Replace: $_ bar 
Final: ffoo bar 

系統:Windows 7,PSH 2位,64位

所以我在做什麼這是錯的還是這個真的是一個錯誤?

編輯6/29:

我做了更換,所以我可以做替代。這很愚蠢,應該有一種方法來禁用解析(這也會使它運行得更快)。

$contents = 'foo' 
$replace = '$_ bar' 
**$rep = $replace -replace '\$','$$$'** 
$final = $contents -replace 'oo', $rep 
Write-Output "Contents: $contents" 
Write-Output "Replace: $replace" 
Write-Output "Final: $final" 

輸出

Contents: foo 
Replace: $_ bar 
Final: f$_ bar 
+0

剛所以我很清楚,您的替換文本字面上是一個美元符號,後面跟着下劃線? IOW - 你不是想用powershell管道變量做些什麼? – David

+0

正確。我想輸出爲 最後:f $ _吧 – user1489948

+0

那麼這很有趣。這看起來像一個錯誤。我嘗試了其他命令,例如'write-output'$ _ bar'',它按預期工作。所以,這對我來說似乎是一個錯誤。當然,只要我這麼說,那些比我更聰明的人會來,並告訴我們它不是。 – David

回答

4

您的問題是 「$ _」 在替換字符串代表了整個輸入字符串。如果你想有一個文字美元符號,你需要逃避它使用$$:

$replace = '$$_ bar' 

有關詳細信息,請參見MSDN上substitutions頁面!

編輯到地址的問題編輯29/6

如果你想要的是一個基本的字符串替換沒有任何的正則表達式所有,只是使用標準的字符串替換,而不是-replace

$final = $contents.replace('oo', $replace) 
+0

這不會工作。我想powershell是不能做到這一點(爲什麼我寫了一個perl腳本)。 在真實腳本中$ replace和$ contents來自腳本外部的其他地方,唯一逃避$ _的方法就是替換它,這是我說的我可以做的事情,但寧可避免,因爲它醜陋。 – user1489948

+0

@ user1489948當您說'來自腳本外部的其他地方'時,您可以更具體地瞭解您。 PowerShell腳本如何/在哪裏取這個值? –

相關問題