切换文件中的字符串
Switch strings in a file
我有一个字符串需要在文件中的两个值之间进行更改。我想做的是,如果我找到值 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。另外,上面的代码将删除文件中的其余内容并只保存我修改回文件的部分。
这没有经过广泛测试,但我认为它应该有效:
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
如果不确切知道数据是什么样子,很难确定。
假设 $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
我有一个字符串需要在文件中的两个值之间进行更改。我想做的是,如果我找到值 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。另外,上面的代码将删除文件中的其余内容并只保存我修改回文件的部分。
这没有经过广泛测试,但我认为它应该有效:
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
如果不确切知道数据是什么样子,很难确定。
假设 $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