Найти несколько строк, охватывающих текст, и заменить их с помощью PowerShell - PullRequest
4 голосов
/ 17 июня 2010

Я использую поиск по регулярному выражению, чтобы найти и заменить какой-либо текст.Текст может занимать несколько строк (может иметь или не иметь разрывы строк).В настоящее время у меня есть это:

 $regex = "\<\?php eval.*?\>"

Get-ChildItem -exclude *.bak | Where-Object {$_.Attributes -ne "Directory"} |ForEach-Object {
 $text = [string]::Join("`n", (Get-Content $_))
 $text -replace $RegEx ,"REPLACED"}

Ответы [ 3 ]

5 голосов
/ 17 июня 2010

Попробуйте это:

$regex = New-Object Text.RegularExpressions.Regex "\<\?php eval.*?\>", ('singleline', 'multiline')

Get-ChildItem -exclude *.bak |
  Where-Object {!$_.PsIsContainer} |
  ForEach-Object {
     $text = (Get-Content $_.FullName) -join "`n"
     $regex.Replace($text, "REPLACED")
  }

Регулярное выражение явно создается через New-Object , так что опции могут быть переданы.

1 голос
/ 17 июня 2010

Попробуйте изменить шаблон регулярного выражения на:

 "(?s)\<\?php eval.*?\>"

для получения одинарной строки (точка соответствует любому символу, включая терминаторы строки). Поскольку вы не используете метасимволы ^ или $, я не думаю, что вам нужно указывать многострочный (^ & $ соответствует встроенным ограничителям строки).

Обновление: Кажется, что -replace гарантирует, что регулярное выражение не учитывает регистр, поэтому опция i не нужна.

0 голосов
/ 06 ноября 2013

Нужно использовать выражение (.|\n)+ для пересечения границ линий поскольку . не соответствует новым строкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...