Извлечь блок текста с помощью регулярных выражений и powershell - PullRequest
0 голосов
/ 28 декабря 2018

Я пишу сценарии powershell и регулярное выражение ниже, чтобы извлечь блок текста между первой строкой (имя порта, состояние типа скорости Vlan) и последней строкой (конец здесь), но это не сработало.Если у вас есть предложения, пожалуйста, помогите!Thx

Запустив этот скрипт, он просто вернул первую строку.

Function Find_Ports($String)

foreach ($File in $Files)
 {
    $Config = Get-Content $File
    $Port =  Select-String -Path $File -Pattern $String | Select - 
     ExpandProperty line | Select-Object -First 1


   if($Port)
     {
       $Port 
     } 
     Else
     {
        Write-Host "no port"
      }   

      }


       Find_Ports " (smi)^Port\s.+Name\s.+Status\s.+Vlan\s.+Duplex\s.+Speed\sType\r\n.*End\Here$"

Ниже приведен текстовый файл

Имя порта Состояние Vlan Duplex Speed ​​Type Gi1 / 1 отключено 1 авто-авто 10/100/1000-TX Gi1 / 2 отключено 1 авто-авто 10 /100/1000-TX Gi1 / 3 отключено 1 авто-авто 10/100/1000-TX Gi1 / 4 отключено 1 авто-авто 10/100/1000-TX Gi1 / 5 отключено 1 авто-авто 10/100/1000-TX Gi1 / 6отключено 150 авто авто 10/100/1000-TX Po1 подключена магистраль a-full a-1000 End Here

1 Ответ

0 голосов
/ 28 декабря 2018

В своем регулярном выражении вы используете \s.+, где .+ будет соответствовать любому символу, кроме новой строки.Я думаю, вы имеете в виду соответствие 1+ пробельных символов, которые можно записать как \s+ без точки.

Вы также избегаете \H, который может быть просто H.Вы также можете опустить флаг без учета регистра, так как точка будет соответствовать символам верхнего и нижнего регистра.

Ваше регулярное выражение может выглядеть следующим образом:

(?sm)^Port\s+Name\s+Status\s+Vlan\s+Duplex\s+Speed\sType\r\n.*End Here$

Regex demo

Не используя опцию, что точка может соответствовать новой строке, вы можете использовать:

^Port\s+Name\s+Status\s+Vlan\s+Duplex\s+Speed\sType\r\n(?:.*\r\n)*?End Here$

Это будет соответствовать

  • ^ Утверждениеначало строки
  • Port\s+Name\s+Status\s+Vlan\s+Duplex\s+Speed\sType Совпадение буквально сопровождается 1+ пробельными символами, но после Speed ​​только один пробельный символ
  • \r\n Совпадение CR + LF
  • (?: Группа без захвата
    • .*\r\n Соответствует любому символу, кроме новой строки, за которым следует CR + LF
  • )*? Закрыть группу без захвата и повторить 0+ раз безжадный
  • $ Утверждение конца строки

Regex demo

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