多列正则表达式匹配配置块

前端之家收集整理的这篇文章主要介绍了多列正则表达式匹配配置块前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一些问题试图匹配某个配置块(多个)从一个文件.下面是我要从配置文件提取的块:
ap71xx 00-01-23-45-67-89
 use profile PROFILE
 use rf-domain DOMAIN
 hostname ACCESSPOINT
 area inside
!

这样就有多个,每个都有不同的MAC地址.如何匹配多个行的配置块?

您可能遇到的第一个问题是,为了匹配多行,您需要将文件内容作为单个字符串而不是单独的行来处理.例如,如果您使用Get-Content读取文件内容,那么默认情况下,它将为您提供一个字符串数组 – 每一行都有一个元素.要跨线路匹配,您需要在单个字符串中的文件(并希望文件不是太大).你可以这样做:
$fileContent = [io.file]::ReadAllText("C:\file.txt")

或者在PowerShell 3.0中,您可以使用-Raw参数的Get-Content:

$fileContent = Get-Content c:\file.txt -Raw

那么你需要指定一个正则表达式选项来匹配跨终止符,即

> SingleLine模式(.匹配包括换行符在内的任何字符),以及
>多行模式(^和$匹配嵌入式行终止符),例如
>(?smi) – 注意“我”是忽略大小写

例如.:

C:\> $fileContent | Select-String '(?smi)([0-9a-f]{2}(-|\s*$)){6}.*?!' -AllMatches |
        Foreach {$_.Matches} | Foreach {$_.Value}

00-01-23-45-67-89
 use profile PROFILE
 use rf-domain DOMAIN
 hostname ACCESSPOINT
 area inside
!
00-01-23-45-67-89
 use profile PROFILE
 use rf-domain DOMAIN
 hostname ACCESSPOINT
 area inside
!

使用Select-String cmdlet进行搜索,因为您可以指定-AllMatches,它将输出所有匹配,而-match操作符在第一次匹配之后停止.有意义,因为它是一个布尔运算符,只需要确定是否有匹配.

猜你在找的正则表达式相关文章