【问题标题】:Switch strings in a file切换文件中的字符串
【发布时间】:2018-06-04 13:56:26
【问题描述】:

我有一个字符串需要在文件中的两个值之间进行更改。我想要做的是如果我找到值A然后更改为值B,如果我找到值B然后更改为值A。将弹出一个消息框说值已更改为[xxxxx]然后背景图片将是也相应地改变了。

$path = c:\work\test.xml
$A = AAAAA
$B = BBBBB
$settings = get-content $path
$settings | % { $_.replace($A, $B) } | set-content $path

我不知道如何使用IF A 然后替换为 B 或 IF B 然后替换 A。此外,上面的代码将删除文件中的其余内容,只保存我修改回来的部分到文件中。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    这没有经过广泛的测试,但我认为它应该可以工作:

    path = c:\work\test.xml
    $A = 'AAAAA'
    $B = 'BBBBB'
    
    [regex]$regex = "$A|$B"
    
    $text = 
    Get-Content $path | 
    foreach {
    $regex.Replace($text,{if ($args[0].value -eq $A){$B} else {$A}})
    }
    
    $text | Set-Content $path
    

    如果不确切知道数据是什么样子,就很难确定。

    【讨论】:

      【解决方案2】:

      假设$A$B 只包含简单的字符串而不是正则表达式,您可以使用带有通配符匹配的switch 语句:

      $path = 'c:\work\test.xml'
      $A = 'AAAAA'
      $B = 'BBBBB'
      
      (Get-Content $path) | % {
        switch -wildcard ($_) {
          "*$A*"  { $_ -replace [regex]::Escape($A), $B }
          "*$B*"  { $_ -replace [regex]::Escape($B), $A }
          default { $_ }
        }
      } | Set-Content $path
      

      [regex]::Escape() 确保在正则表达式中具有特殊含义的字符被转义,因此值被替换为文字字符串。

      如果您的目标是更高级的东西,您可以使用带有回调函数的正则表达式替换:

      $path = 'c:\work\test.xml'
      $A = 'AAAAA'
      $B = 'BBBBB'
      
      $rep = @{
        $A = $B
        $B = $A
      }
      
      $callback = { $rep[$args[0].Groups[1].Value] }
      
      $re = [regex]("({0}|{1})" -f [regex]::Escape($A), [regex]::Escape($B))
      
      (Get-Content $path) | % {
        $re.Replace($_, $callback)
      } | Set-Content $path
      

      【讨论】:

      • 谢谢,非常有用的解释。不涉及正则表达式,只有简单的字符串。
      猜你喜欢
      • 2020-06-04
      • 1970-01-01
      • 2017-10-16
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      相关资源
      最近更新 更多