【问题标题】:Replace different occurences of String with different values in powershell?在powershell中用不同的值替换不同出现的字符串?
【发布时间】:2014-10-22 17:11:11
【问题描述】:

我对 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

但这取代了所有的发生,也取代了整个路径。请帮忙..

【问题讨论】:

    标签: regex powershell replace select-string


    【解决方案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"
    

    这种方法显然只有在你知道你将有多少次出现以及你想替换其中哪些时才有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 2011-04-28
      • 2011-07-08
      • 2020-06-13
      • 1970-01-01
      相关资源
      最近更新 更多