2017-06-06 79 views
0

替换字符串考虑这个文件在PowerShell中使用正则表达式用单引号

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行是赞赏。

回答

2

如果你只是想更换引号版本中的文本,你可以做到以下几点:

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

它会在你的文本替换4.0.0通过<ReplaceWith>

+0

@pandemic:如果你想替换单引号内的任何字符串,你必须为每个替换都做这个,beca使用我猜想替换文本将不会是相同的每个项目 – Gawil

0

你可以试试这个:

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

您需要使'*'懒惰,否则它将无法正常工作。你的正则表达式将从'version'匹配到''rest','这里 – Gawil

+0

你是什么意思使*懒惰?我的代码工作,但我可以改善我的正则表达式;-) – Manu

+0

默认情况下,'*'是贪婪的。这意味着它会匹配尽可能多的角色。在这里,他会停下来阅读最后的文字。让他懒惰是通过在它后面添加一个'?'来完成的,所以它可以匹配最少的字符。 – Gawil

相关问题