【问题标题】:Replace text after a string with powershell用powershell替换字符串后的文本
【发布时间】:2014-06-06 22:51:23
【问题描述】:

大家好,我正在使用 powershell 使用构建号替换一些 cacheBuster 值。

我已经用内部版本号替换了一个基本字符串,工作正常。但是,当文件未更新时,它不会从 svn 中清除,因此我的匹配参数不再有效。

到目前为止我的代码是这样的

JS 文件

 "deps": ["app"],
    "name": "app",
    "urlArgs": "bust=",
    "waitSeconds"  : 60,
    "catchError": {
        "define": true
    }

Powershell 脚本

$path = "jsmin\config.js"
$word = "bust="
$replacement = $build
$text = get-content $path 
$newText = $text -replace $word,$replacement
$newText > $path

我想要解决这个问题是寻找一个像 bust=buildnumber 这样的变量,然后将 bust= 之后的所有文本替换为 buildNumber。我假设我需要一个正则表达式来做到这一点,但不确定如何做。

任何帮助都会很棒

【问题讨论】:

    标签: regex string powershell teamcity


    【解决方案1】:

    你可以试试这个:

    $path = "jsmin\config.js"
    $word = "bust="
    $text = Get-Content $path 
    $text -replace ("(?<=$word)" +'(.*?)(?=")'), $build | Set-Content $path
    

    【讨论】:

    • 感谢您的回复,关闭它确实会替换正确的区域,但是在添加构建后它会在 bust=292929 后擦除文件的其余部分
    • 它有一个错误,因为它删除了最后一个 ", 但如果它删除了您的其余文本,那么您的 js 文件是单行的,而不是像您的示例那样的多行。尝试更新答案
    • 是的,这正是我在缩小文件上运行的问题。您的新代码运行良好,谢谢。
    【解决方案2】:

    一种可能的选择。如果您使用的是具有 Convert[To|From]-Json 的 PowerShell 版本,则可以将 Json 转换为 PowerShell 对象、获取属性名称、检查值、更新目标并将 PS 对象转换回 Json。

    比正则表达式更冗长、更慢,但却是一个选项。

    $build=(Get-Date).ToString("yyyyMMddhhmmss")
    
    $js = @"
    {
     "deps": ["app"],
        "name": "app",
        "urlArgs": "bust=",
        "waitSeconds"  : 60,
        "catchError": {
            "define": true
        }
    }
    "@ | ConvertFrom-Json 
    
    $pn = ($js | Get-Member -MemberType *Property).Name
    
    $pn | % {
        if($js.$PSItem -match "^bust=") 
        {
            $js.$PSItem="bust=$build"
        }
    }
    
    $js | ConvertTo-Json # > "config.js"
    

    【讨论】:

      猜你喜欢
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      相关资源
      最近更新 更多