2015-01-27 4 views
0

У меня строка должна быть изменена в файле между двумя значениями. То, что я хочу сделать, - это если я нашел значение 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 А затем заменить B или B IF затем заменить A. Кроме того, приведенный выше код будет удалить остальную часть содержимого в файл и сохранить только ту часть, которую я модифицированную назад к файлу.

ответ

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() гарантирует, что символы, имеющие специальный meaing в регулярных выражениях escaped, поэтому значения заменяются как литеральные строки.

Если вы стремитесь к чему-то немного более продвинутый, вы могли бы использовать регулярное выражение замены с функцией обратного вызова:

$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 
+1

Спасибо, очень полезно объяснение. нет никакого регулярного выражения, только простые строки. –

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 

Трудно быть уверенным, не зная точно, что выглядит как данные.

Смежные вопросы