在powershell中用不同的值替换不同出现的String?

时间:2014-10-22 17:11:11

标签: regex powershell replace select-string

我是PowerShell脚本的新手。方案是我必须用不同的值替换第一次出现的字符串,第二次使用不同的值。

到目前为止,我有这个:

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

这将输出为:

D:\hg\default\AcceptanceTests\sample.config:5:            dbServer = "@DB_SERVER@"
D:\hg\default\AcceptanceTests\sample.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

但这取代了所有出现以及整个路径。请帮忙..

1 个答案:

答案 0 :(得分:1)

以下是我的想法:

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

这种方法显然只有在您知道有多少出现以及想要替换哪些出现时才有效。