#windows #powershell
Вопрос:
Я пытаюсь заменить строку в текстовом файле. Вот мой текстовый файл и Powershell
скрипт
Текстовый файл
String^ m5 = ss.FileMD5(a, salt);
if (m5 != "e11621cc4370a5203423cc1d1ee8c2a7") {
return 6; //mismatch
}
Сценарий Powershell
$fl = "G:tmptesttest.txt"
$find = "m5 !="
$repl = 'if (m5 != "aaaaaaaa") {'
$content = (Get-Content $fl)
$line = $content | Select-String $find | Select-Object -ExpandProperty Line
if ($line -eq $null) {
"Match Not Found"
exit
} else {
$content = $content | ForEach-Object { $_ -replace $line, $repl }
$content # print replaced content
}
Это всегда печать старого контента без замены.
Что плохого я делаю в этом сценарии ?
Ответ №1:
При попытке заменить переменная $line if (m5 != "e11621cc4370a5203423cc1d1ee8c2a7") {
содержит специальные символы регулярного выражения, которые необходимо экранировать.
Изменить
$content = $content | ForEach-Object { $_ -replace $line, $repl }
Для
$content = $content | ForEach-Object { $_ -replace [regex]::Escape($line), $repl }
Комментарии:
1. В качестве альтернативы вы можете использовать
$content = ($content).replace($line,$repl)
, который рассматривает его как обычный текст, а не регулярное выражение.String.replace()
является методом, в котором-replace
используется оператор2. @Дрю
($content).replace($line,$repl)
тоже работает нормально. Я буду помнить это.