我在下面编写了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 在这里结束
答案 0 :(得分:0)
在正则表达式中,您使用\s.+
,其中.+
将匹配换行符以外的任何字符。我认为您的意思是匹配1+个空格字符,这些字符可以写成\s+
,而没有点。
您还将转义\H
的{{1}}。您也可以省略不区分大小写的标志,因为该点将匹配大小写字符。
您的正则表达式可能如下:
H
不使用点可以与换行符匹配的选项,可以使用:
(?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次以上非贪婪)*?
声明字符串的结尾