PowerShell multiple string replacement efficiency

前端 未结 4 918
梦谈多话
梦谈多话 2020-12-20 16:54

I\'m trying to replace 600 different strings in a very large text file 30Mb+. I\'m current building a script that does this; following this Question:

Script:

4条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-20 17:23

    Combining the hash technique from Adi Inbar's answer, and the match evaluator from Keith Hill's answer to another recent question, here is how you can perform the replace in PowerShell:

    # Build hashtable of search and replace values.
    $replacements = @{
      'something0' = 'somethingelse0'
      'something1' = 'somethingelse1'
      'something2' = 'somethingelse2'
      'something3' = 'somethingelse3'
      'something4' = 'somethingelse4'
      'something5' = 'somethingelse5'
      'X:\Group_14\DACU' = '\\DACU$'
      '.*[^xyz]' = 'oO{xyz}'
      'moresomethings' = 'moresomethingelses'
    }
    
    # Join all (escaped) keys from the hashtable into one regular expression.
    [regex]$r = @($replacements.Keys | foreach { [regex]::Escape( $_ ) }) -join '|'
    
    [scriptblock]$matchEval = { param( [Text.RegularExpressions.Match]$matchInfo )
      # Return replacement value for each matched value.
      $matchedValue = $matchInfo.Groups[0].Value
      $replacements[$matchedValue]
    }
    
    # Perform replace over every line in the file and append to log.
    Get-Content $filePath |
      foreach { $r.Replace( $_, $matchEval ) } |
      Add-Content 'C:\log.txt'
    

提交回复
热议问题