2017-02-24 33 views
5

我正在嘗試編寫PowerShell腳本來將我的.nuspec文件(nuget depdency)更新爲最新的構建版本。雖然我遇到了通配符問題。Powershell通配符/正則表達式替換

所以我想替換該行

<dependency id="MyCompany.Common" version="1.0.0.0" /> 

到一個新的版本號的版本號,即版本2.2.2.2

<dependency id="MyCompany.Common" version="2.2.2.2" /> 

我的當前位置的方法是這樣的。注意:我需要一個通配符,因爲我有解決方案,我需要更換多的NuGet包,都遵循的MyCompany.PackageName

$filecontent -replace 'id="MyCompany.*" version="*"', "$Version" | Out-File $file 

格式,但其實這最終建立

<dependency 2.2.2.21.0.0.0" /> 

如何修改我的正則表達式來確保它只替換版本號組件?

回答

4

替換

$filecontent -replace 'id="MyCompany(.*?)" version=".*?"', "id=`"MyCompany`$1`" version=`"$Version`"" | Out-File $file 
+0

的字符串版本。這一點,如果我在第二個參數中使用雙引號,反斜槓似乎不會逃脫它們。但是,如果我使用單引號,它會寫入「$ Version」而不是「xxxx」 – Chris

+0

@Chris嘗試轉義'$'來測試 –

+0

我使用了反引號''''而不是'\「',它的工作原理 – Chris

1
$s = '<dependency id="MyCompany.Common" version="2.2.2.2" />' 
$s -replace 'version=".*"', 'version="1.2.3.4"'<dependency id="MyCompany.Common" version="1.2.3.4" /> 
+0

謝謝,但這樣做的問題是,它可能不是'.Common'它可能是'.Data'等,這樣有做一個通配符 – Chris

+0

@Chris這個答案完全忽略了'id'字段,它會一直保持,同時也改變了沒有'id =「MyCompany。*」' –

2

我用一個簡單的使用捕獲組去,所以我不會失去你的正則表達式的特異性,只匹配字符串與「MyCompany的。*」的ID,但不會增加很多複雜性。我捕捉到版本中的所有內容,並將下一個報價前的內容替換爲新的版本號。

$test='<dependency id="MyCompany.Common" version="1.0.0.0" />' 
$newVersion='2.2.2.2' 
$test -replace "(id=`"MyCompany`..*`" version=)`"[^`"]*","`$1`"$newVersion" 

<dependency id="MyCompany.Common" version="2.2.2.2" /> 

在PS測試4.0

Powershell的怪異和脆弱位包括:

  • 反引號逃脫,而不是\

  • 正則必須在 「雙引號」

  • 必須使用單引號,逃避有捕捉組替換字符串中的工作

+0

這似乎沒有爲我做任何事情;/ – Chris

+0

可能想再試一次,沒有'PS>' –