Почему бы просто не использовать Select-String?
ls *.php | Select-String "<?php eval"
Шаблон, заданный для Select-String
, читается как регулярное выражение. Вы можете выполнить сопоставление в обычном тексте, указав переключатель simpleMatch
:
ls *.php | Select-String "<?php eval" -simpleMatch
Вот команда для получения оперативной справки по регулярным выражениям PowerShell:
get-help about_regular_expression
EDIT:
Ах, вы не указали в своем вопросе, что выполняли операцию ЗАМЕНА. Это немного отличается, особенно потому, что он занимает несколько строк. Я бы предложил что-то вроде этого:
# Retrieve file as a single string.
$contents = [string]::Join("`n", $(Get-Content path\to\file.php))
# Now replace.
$replaced = $contents -replace '(?s)(<\?php eval\()(.*?)(\)\?>)', '$1neweval$3'
Итак, что это делает, ищет <?php eval(
, затем LAZILY (важно!) Ищет )?>
, все в однострочном режиме, поэтому новые строки сопоставляются в части .*?
. (Разбивается перед знаками вопроса и ставится в скобки, чтобы избежать их.) Затем он заменяет все совпадения группой 1 (в данном случае <?php eval(
), некоторым текстом, а затем группой 3 ()?>
). Вы можете сделать группировку настолько сложной, насколько это необходимо для сбора информации внутри матча.
Кроме того, поскольку вы пытаетесь использовать регулярное выражение для синтаксического анализа языка, вместо синтаксического анализатора языка, во многих случаях это может пойти ужасно, ужасно неправильно. Просто будьте внимательны и не забивайте свои файлы, пока не убедитесь, что вывод правильный.