PowerShell正则提取指定组的用户权限信息问题求助
解决PowerShell中提取指定组的用户权限信息问题
你当前的代码仅匹配到目标组的标题行,因为Select-String默认只返回符合模式的单行,没有捕获组标题之后的用户权限内容。以下是两种可行的解决方案:
方案一:使用多行正则匹配(推荐)
直接对整个$user_access字符串执行正则匹配,一次性提取目标组及其下属的所有用户权限内容:
$groupSelected = "group2" # 构建正则模式,匹配目标组标题及后续非组标题的有效行 $pattern = "^@$groupSelected`n(?:(?!^@).+`n?)+" # 启用多行模式执行匹配,提取结果 $Result = [regex]::Match($user_access, $pattern, [System.Text.RegularExpressions.RegexOptions]::Multiline).Value # 输出结果 $Result
正则模式说明:
^@$groupSelected:匹配以@开头的目标组标题行(多行模式下^表示行首)(?:(?!^@).+n?)+:非捕获组,匹配所有**不以@开头**的有效行((?!^@)`是负向前瞻,避免匹配下一个组的标题),`+`支持匹配多行,`n?`兼容最后一行无换行的情况
方案二:逐行遍历筛选
通过拆分字符串为行数组,定位目标组的起始行后,向后遍历直到遇到新组或空行:
$groupSelected = "group2" $lines = $user_access -split "`n" # 找到目标组所在的行索引 $startIndex = ($lines | Select-String "^@$groupSelected").LineNumber - 1 $endIndex = $startIndex # 向后遍历,确定结束位置 while ($endIndex + 1 -lt $lines.Count -and $lines[$endIndex + 1] -notmatch "^@" -and $lines[$endIndex + 1].Trim() -ne "") { $endIndex++ } # 提取并合并目标行 $Result = $lines[$startIndex..$endIndex] -join "`n" $Result
两种方案执行后,都会得到你期望的结果:
@group2 user2 = read user4 = readwrite user5 = readwrite
内容的提问来源于stack exchange,提问作者sjqwer1
相关产品推荐
相关产品推荐

