Вот как бы я поступил по этому поводу. Во-первых, когда вам нужно получить все содержимое файла для таких целей, как замена текста на несколько строк, пропустите, используя Get-Content
, вместо этого используйте [IO.file]::ReadAllText()
. Затем используйте оператор -replace
, например ::100100
[IO.File]::ReadAllText("$pwd\foo.sql") -replace `
'(?s).*?(USE \[\$\(DatabaseName\)\].*)$',"foo`n`$1" > foo.sql
Здесь я заменяю начальный текст на "foo". Также обратите внимание, что чтобы получить регулярное выражение, используемое -replace
для сопоставления по новым строкам, я добавляю к регулярному выражению (?s)
- одиночный режим.
Mjolinor поднимает хороший вопрос, если в тексте замены есть символы, которые можно интерпретировать как специальные переменные регулярного выражения, например, $1
, $2
и т. Д. Хотя вы можете использовать [regex]::escape()
для выхода из регулярного выражения, есть еще PowerShell, который будет интерпретировать $<something>
как переменную или начало подвыражения. В этом случае обойти это довольно просто, просто захватив часть, которую вы хотите сохранить, с помощью оператора -replace
, а затем добавьте новый текст на втором шаге, например ::
$keep = [IO.File]::ReadAllText("$pwd\foo.sql") -replace `
'(?s).*?(USE \[\$\(DatabaseName\)\].*)$','$1'
$newText + $keep > foo.sql
Обратите внимание, что при замене в этом случае я использую одинарные кавычки вокруг $1
, что не позволяет PowerShell интерпретировать любые специальные символы PowerShell. Это похоже на дословную строку в C #.