【问题标题】:Powershell wildcard / regex replacePowershell通配符/正则表达式替换
【发布时间】:2017-02-24 14:27:01
【问题描述】:

我正在尝试编写一个 PowerShell 脚本来将我的 .nuspec 文件 (nuget depdency) 更新到最新的构建版本。不过,我在使用通配符时遇到了问题。

所以我想替换这一行的版本号

<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" />

如何修改我的正则表达式以确保它仅替换版本号组件?

【问题讨论】:

    标签: regex powershell nuget


    【解决方案1】:

    替换为

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

    【讨论】:

    • 嘿,谢谢你,如果我在第二个参数中使用双引号,反斜杠似乎不会转义它们。但是如果我使用单引号,它会写成 "$Version" 而不是 "x.x.x.x"
    • @Chris 试图逃避$ 只是为了测试
    • 好吧,我刚刚意识到这不太行......现在它输出id="MyCompany" version="x.x.x.x",所以它不会将.Common添加回MyCompany
    • 因为如果 $1 在双引号中,shell 会扩展它
    • 使用 " 并把 ` 作为 $1 的前缀? @克里斯
    【解决方案2】:

    我简单地使用了捕获组,这样我就不会失去正则表达式的特殊性,只匹配 id 中带有 'MyCompany.*' 的字符串,但不会增加很多复杂性。我捕获了版本中开头引号之前的所有内容,并将下一个引号之前的内容替换为新版本号。

    $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 古怪和脆弱的部分包括:

    • 反引号代替\

    • 正则表达式必须在“双引号”中

    • 必须使用单引号或转义符让捕获组在替换字符串中工作

    【讨论】:

    • 这似乎对我没有任何作用 Will ;/
    • 可能想再试一次,没有PS &gt;
    【解决方案3】:
    $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" />
    

    【讨论】:

    • 谢谢,但问题是它可能不是.Common 它可能是.Data 等等,所以必须是通配符
    • @Chris 这个答案完全忽略了id 字段,它会一直坚持下去,但需要注意的是还要更改没有id="MyCompany.*" 的字符串的版本
    猜你喜欢
    • 2014-05-19
    • 2022-11-04
    • 1970-01-01
    • 2020-12-10
    • 2012-06-20
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多