【问题标题】:Using regex in Powershell replace string in single quotation marks在Powershell中使用正则表达式替换单引号中的字符串
【发布时间】:2017-06-06 14:42:17
【问题描述】:

考虑这个文件

AppConfig = {
    version: '4.0.0',
    clientId: "guid",
    httpProxy: 'rest',
    restUrl: "http://url.contoso.com/v1/",

    conferences: ["lync", "hangouts", "webex"],    // "lync", "hangouts", "webex"

    dataRefreshInterval: 60 //seconds
} 

我想用另一个字符串替换单引号内的字符串。我想更改特定属性的值(在我的情况下为 version)。

$content = Get-Content $VersionFile

for($i = 0;$i -lt $content.Count; $i++)
{
    if($content[$i] -like "*version:*")
    {
        $content[$i] = $content[$i] -creplace <replaceWhat>, <replaceWith>
    }      
}

感谢您以更优雅的方式找到version 的行。

【问题讨论】:

    标签: regex powershell


    【解决方案1】:

    如果您只想替换版本引号内的文本,您可以执行以下操作:

    $content = Get-Content $VersionFile
    $replacement = <ReplaceWith>
    $content = $content -creplace "version: '[^']*'","version: '$replacement'"
    

    它将在您的文本中将4.0.0 替换为&lt;ReplaceWith&gt;

    【讨论】:

    • @pandemic:如果你想替换单引号内的任何字符串,你必须在每次替换时都这样做,因为我猜每个项目的替换文本不会相同
    【解决方案2】:

    你可以试试这个:

    $version = "x.x.x.x"
    $content = Get-Content $VersionFile
    $content -replace "version: '(.*)'","version: '$version'"
    

    【讨论】:

    • 你需要让*变得懒惰,否则它不会工作。您的正则表达式将从version 匹配到'rest', 这里
    • 让 * 变得懒惰是什么意思?我的代码有效,但我可以改进我的正则表达式 ;-)
    • 默认情况下,* 是贪婪的。这意味着它将匹配尽可能多的字符。在这里,他将停在正文的最后一个'。让他变得懒惰是通过在其后添加 ? 来完成的,因此它匹配尽可能少的字符。
    • 哦,对不起,我错了,你的正则表达式仍然有效。这是因为. 默认情况下不会匹配换行符。没必要在这里偷懒,我的坏...
    • 好的,感谢您的解释,但是在这种情况下,它可以工作并且直到最后一个 ' 才替换所有字符,但只有在找到第一个模式 version: 'xxxx' 之后才替换所有字符。你的意思是在其他情况下.* 会过于宽容?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2012-11-24
    • 2014-06-24
    • 2023-03-21
    相关资源
    最近更新 更多