【问题标题】:Extract block of text using regex and powershell使用正则表达式和 powershell 提取文本块
【发布时间】:2018-12-28 02:16:41
【问题描述】:

我在下面编写了 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-full a-1000 到此结束

【问题讨论】:

  • 你为什么要逃避H^Port Name Status Vlan Duplex Speed[\w\W]+End Here$ 这个怎么样?

标签: regex


【解决方案1】:

在您的正则表达式中,您使用\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

【讨论】:

  • 您的正则表达式在 regexstorm 测试仪上工作,但在我的 PowerShell 脚本中不起作用。由于某种原因,当我运行代码时,\r\n 未被识别为回车符和换行符。我假设我使用 .NET 正则表达式。您还有其他建议吗?
  • 尝试用(?:\r?\n|\r)+ 替换\r\n 例如^Port\s+Name\s+Status\s+Vlan\s+Duplex\s+Speed\sType(?:\r?\n|\r)+(?:.*(?:\r?\n|\r)+)*?End Here$ demo
  • 所以应该是这样的 ^Port\s+Name\s+Status\s+Vlan\s+Duplex\s+Speed\sType(?:\r?\n|\r) +(?:.*(?:\r?\n|\r)+)*?End Here$ 我运行它,它没有返回任何端口
  • 它在 RegexStorm 网站上运行良好,但不确定为什么在我运行我的 Powershell 脚本时 \r\n 不起作用
  • @Justin 所以你确实得到了你正在寻找使用正则表达式的匹配项?
猜你喜欢
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
相关资源
最近更新 更多