Замена текста определенным текстом

#powershell

#powershell

Вопрос:

У меня есть текстовый файл, который содержит следующее

 php_configuration=up21
sql_configuration=up22
apache_configuration=up23
java_script=down
html=down
  

Я хочу заменить up21 , up22 и up23 на cat , dog и elephant и сохранить оставшееся содержимое файла таким, какое оно есть.

Но когда я выполняю приведенный ниже сценарий powershell, он заменит строки, но не сохранит оставшееся содержимое текстового файла:

 $a=Get-Content -Path C:UsersAdministratorDesktopPowloc.txt |Select-String -Pattern 
    "php_configuration"|ForEach-Object {$_ -Replace 'up21', 'cat'}
          
        
$b=Get-Content -Path C:UsersAdministratorDesktopPowloc.txt |Select-String -Pattern 
    "sql_configuration"|ForEach-Object {$_ -Replace 'up22', 'dog'}
        
$c=Get-Content -Path C:UsersAdministratorDesktopPowloc.txt |Select-String -Pattern 
    "apache_configuration"|ForEach-Object {$_ -Replace 'up23', 'elephant'}
        
$a, $b, $c| Set-Content -Path C:UsersAdministratorDesktopPowloc.txt
  

Комментарии:

1. Это потому $a, $b, $c , что вы вставляете Set-Content без остальной части текста. Вы пытались Get-Content использовать весь файл и сохранить его в переменной, затем -Replace эти строки и, наконец Set-Content ?

Ответ №1:

В принципе, вы можете сделать следующее:

 (Get-Content 'C:UsersAdministratorDesktopPowloc.txt') | Foreach-Object {
 $_ -replace 'up21', 'cat' `
    -replace 'up22', 'dog' `
    -replace 'up23', 'elephant'
 } | Set-Content 'C:UsersAdministratorDesktopPowloc.txt'
  

Есть ли необходимость указывать «php_configuration» и т. Д.?

РЕДАКТИРОВАТЬ: Хорошо, после прочтения комментария @T-Me ниже я изменил ответ. Не самый красивый, но вот и все.

 (Get-Content 'C:UsersAdministratorDesktopPowloc.txt') | Foreach-Object {
     if($_ | Select-string -Pattern "php_configuration"){$_ -replace 'up21', 'cat'}
     elseif($_ | Select-String -Pattern "sql_configuration"){$_ -replace 'up22', 'dog'}
     elseif($_ | Select-String -Pattern "apache_configuration"){$_ -replace 'up23', 'elephant'}
     else {$_}
     } | Set-Content 'C:UsersAdministratorDesktopPowloc.txt'
  

Комментарии:

1. Я бы предположил, что up s являются переменными, и вы не хотите каждый раз менять сценарий. Таким образом, он может использовать Select-String -Pattern для идентификации всей строки. Для захвата up s ему понадобится регулярное выражение в -replace