Powershell Regex для поиска и удаления функции - PullRequest
0 голосов
/ 05 октября 2011

Я пытаюсь найти функцию на нескольких сотнях страниц и удалить ее с помощью Powershell.Я могу сопоставить одну строку, но у меня возникают проблемы с получением многострочного соответствия.Буду признателен за любую помощь.

Функция, которую я пытаюсь найти:

Protected Function MyFunction(ByVal ID As Integer) As Boolean
    Return list.IsMyFunction()  
End Function

Код, который я использую, не соответствует многострочному:

gci -recurse | ?{$_.Name -match "(?i)MyPage.*\.aspx"} | %{
  $c = gc $_.FullName;
  if ($c -match "(?m)Protected Function MyFunction\(ByVal ID As Integer\) As Boolean.*End Function")  {
    $_.Fullname | write-host;
  }
}

Ответы [ 2 ]

3 голосов
/ 05 октября 2011

Вы можете использовать флаг (?s) в регулярном выражении.S для однострочного, также называемого, точка в некоторых местах, что делает совпадение . между строками.

Кроме того, gc читает строку за строкой, и любое сравнение / совпадение будет между отдельными строками и регулярным выражением.Вы не получите совпадение, несмотря на использование правильных флагов в регулярном выражении.Я обычно использую [System.IO.File]::ReadAllText(), чтобы получить все содержимое файла в виде одной строки.

Так что рабочим решением будет что-то вроде:

gci -recurse | ?{$_.Name -match "(?i)MyPage.*\.aspx"} | %{
  $c = [System.IO.File]::ReadAllText($_.Fullname)
  if ($c -match "(?s)Protected Function MyFunction\(ByVal ID As Integer\) As Boolean.*End Function")  {
    $_.Fullname | write-host;
  }

}

Для замены вы, конечно, можете использовать$matches[0] и использовать Replace() метод

$newc = $c.Replace($matches[0],"")
1 голос
/ 05 октября 2011

По умолчанию оператор -match не будет искать. * Через возврат каретки. Вам нужно будет использовать функцию .Net Regex.Match напрямую, чтобы указать опцию поиска 'singleline' (к сожалению, в данном случае она названа):

[Regex]::Match($c,
               "(?m)Protected Function MyFunction\(ByVal ID As Integer\) As Boolean.*End Function", 
               'Singleline')

См. Функции Match и допустимые параметры регулярного выражения в MSDN для получения более подробной информации.

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