Regex 使用Powershell子字符串和正则表达式提取数量可变的令牌
所以我从这个论坛得到了使用下面的Powershell和Regex的帮助Regex 使用Powershell子字符串和正则表达式提取数量可变的令牌,regex,powershell,text-parsing,Regex,Powershell,Text Parsing,所以我从这个论坛得到了使用下面的Powershell和Regex的帮助 if((get-content -Raw c:\config.txt) -match '(?ms)^999.*?(?=\r?\n\S|\Z)') { $matches[0]} 要成功从下面的配置中提取vlan 999未使用的正确信息,请执行以下操作 1 default active Fa0/4, Fa0/5, Fa0/6, Fa0/7, Fa0/8 120
if((get-content -Raw c:\config.txt) -match '(?ms)^999.*?(?=\r?\n\S|\Z)')
{ $matches[0]}
要成功从下面的配置中提取vlan 999未使用的正确信息,请执行以下操作
1 default active Fa0/4, Fa0/5, Fa0/6, Fa0/7, Fa0/8
120 Camera active Fa0/2
130 Student active Fa0/1
100 Management active
999 Unused active Fa0/10, Fa0/11, Fa0/12, Fa0/13,
Fa0/14, Fa0/15, Fa0/16, Fa0/17
Fa0/18, Fa0/19
然后我可以使用下面的substring方法提取端口号,如下所示
Fa0/10, Fa0/11, Fa0/12, Fa0/13, Fa0/14, Fa0/15, Fa0/16, Fa0/17 Fa0/18, Fa0/19
$Unused_VLAN = $Matches[0]
$Unused_ports = Unused_VLAN.substring (48, 77)
我的问题是我必须在多个配置文件上提取这些信息,而每个配置文件都有不同数量的未使用端口
我的问题是,有比使用substring方法提取未使用的端口更好的方法,因为我必须指定字符串的确切起始位置和结束位置来提取端口,因此其他配置文件具有不同数量的未使用端口,而我使用的子字符串不起作用。感谢advanced的帮助这是一个实用的解决方案,它使用PowerShell的
-split
操作符的一元形式:
# Get the block of relevant lines as a single string.
$unusedVlan = if ((Get-Content -raw c:\config.txt) -match '(?ms)^999.*?(?=\r?\n\S|\Z)')
{ $Matches[0]}
# Split the string into an array of token by whitespace,
# remove all "," instances,
# and skip the first 3 tokens
# (the tokens *before* the port numbers, namely '999', 'Unused', 'active')
# The result is an *array* of all port numbers: @( 'Fa0/10', 'Fa0/11', ... )
$unusedPorts = (-split $unusedVlan) -replace ',' | Select-Object -Skip 3
# Output the array
$unusedPorts
请尝试以下正则表达式以获取所有匹配项:
(?sm)(?这将给出与使用“(?sm)(?=^999.*?(?=\r?\n\S |\Z)相同的结果)“。我正在寻找一种比使用子字符串更好的方法,根据不同的配置文件动态提取未使用的端口号。这些配置文件可能有不同数量的未使用端口。创建时,它起作用了,但如果我取出-raw,它就不起作用了。我的问题是,我想获取内容,读取文件夹中的所有配置文件,并选择字符串。”要提取主机名、版本号等,如果我使用-raw,则选择字符串不起作用。@Justin:很高兴听到它。关于剩余问题:我没有完全理解,但我建议你问一个新问题-完成后,请在这里ping我。