使用正则表达式和Powershell提取文本块

时间:2018-12-28 02:16:42

标签: regex

我在下面编写了powershell脚本和正则表达式,以提取第一行(端口名状态Vlan速度类型)和最后一行(此处结束)之间的文本块,但是没有用。如果您有建议,请帮忙!谢谢

运行此脚本,它仅返回第一行。

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双工速度类型 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-全A-1000 在这里结束

1 个答案:

答案 0 :(得分:0)

在正则表达式中,您使用\s.+,其中.+将匹配换行符以外的任何字符。我认为您的意思是匹配1+个空格字符,这些字符可以写成\s+,而没有点。

您还将转义\H的{​​{1}}。您也可以省略不区分大小写的标志,因为该点将匹配大小写字符。

您的正则表达式可能如下:

H

Regex demo

不使用点可以与换行符匹配的选项,可以使用:

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

那将匹配

  • ^Port\s+Name\s+Status\s+Vlan\s+Duplex\s+Speed\sType\r\n(?:.*\r\n)*?End Here$ 断言字符串的开头
  • ^字面匹配,后接1+个空格字符,但在Speed之后仅匹配一个空格字符
  • Port\s+Name\s+Status\s+Vlan\s+Duplex\s+Speed\sType匹配CR + LF
  • \r\n非捕获组
    • (?:匹配除换行符后跟CR + LF之外的任何字符
  • .*\r\n关闭非捕获组并重复0次以上非贪婪
  • )*?声明字符串的结尾

Regex demo