我有一些问题试图匹配某个配置块(多个)从一个文件.下面是我要从配置文件中提取的块:
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操作符在第一次匹配之后停止.有意义,因为它是一个布尔运算符,只需要确定是否有匹配.