在powershell中用不同的值替换不同出现的字符串



我对powershell脚本还很陌生。场景是,我必须用不同的值替换字符串的第一次出现,用不同的数值替换第二次出现。

到目前为止,我有这个:

  $dbS = Select-String  $repoPathAcceptanceTestssample.config -Pattern([regex]'dbServer =     "@DB_SERVER@"')  
write-output $dbS[0]
write-output $dbS[1]

这将输出为:

D:hgdefaultAcceptanceTestssample.config:5:            dbServer = "@DB_SERVER@"
D:hgdefaultAcceptanceTestssample.config:12:            dbServer = "@DB_SERVER@"

我可以看到这两种情况都是正确的,这将返回一个MatchInfo对象。现在我需要替换内容,我尝试了:

Get-Content $file | ForEach-Object { $_ -replace "dbserver",$dbS[0] } | Set-Content ($file+".tmp")
Remove-Item $file
Rename-Item ($file+".tmp") $file

但这也用整个路径取代了所有的发生和那。请帮忙。。

以下是我的想法:

$dbs = Select-String .test.config -pattern([regex]'dbServer =     "Test1"')
$file = Get-Content .test.config
$dbs | % {$file[$_.linenumber-1] = $file[$_.linenumber-1] -replace "Test1", "Test3" }
set-content .test.config $file

它循环遍历Select-String的所有结果,并使用其.LineNumber属性(-1)作为数组索引,仅替换该行中的文本。接下来我们只是重新设置内容。

如果你想为发生1和2分配不同的值,你可以这样做:

#replace first occurance
$file[$dbs[0].LineNumber-1] = $file[$dbs[0].LineNumber-1] -replace "Test1", "Test2"
#replace second occurance
$file[$dbs[1].LineNumber-1] = $file[$dbs[1].LineNumber-1] -replace "Test1", "Test3"

显然,只有当你知道你会有多少次出现,以及你想替换其中的哪一次时,这种方法才有效。

相关内容

  • 没有找到相关文章

最新更新