如何用PowerShell匹配文本文件特定三行并提取中间行内容
解决PowerShell提取特定三行组中间内容的问题
我明白你要解决的问题了——从文本文件里批量提取每一组' 1'、目标行、' 40'这三行里的中间内容,而且目标行必须是2-4个字符长。你之前的正则表达式因为允许中间匹配任意数量的换行,所以会捕获到多余的内容,咱们来修正这个问题。
核心思路
我们需要构建一个精确匹配三行结构的正则:
- 第一行严格是
' 1'(注意开头的空格),行首行尾匹配(避免部分匹配) - 第二行是长度2-4的任意字符(如果需要限制字符类型,可以调整,比如只允许字母数字就改成
[a-zA-Z0-9]{2,4}) - 第三行严格是
' 40',行首行尾匹配 - 同时启用多行模式,让
^和$匹配每一行的开头和结尾,而不是整个文本的首尾
实现方式1:使用[regex]::Matches批量提取
这是最直接的方式,可以一次性捕获所有符合条件的中间行:
$filename1 = "你的文件路径.txt" $content = Get-Content $filename1 -Raw # 构建正则表达式,(?m)启用多行模式 $pattern = '(?m)^\s1\r?\n(.{2,4})\r?\n^\s40$' # 匹配所有符合条件的组 $matches = [regex]::Matches($content, $pattern) # 提取每一个匹配到的中间内容 foreach ($match in $matches) { $match.Groups[1].Value.Trim() # Trim可选,如果你想去掉目标行的首尾空格 }
实现方式2:使用Select-String结合上下文
如果你想先定位到' 1'行,再取它的下一行并验证下下行是否是' 40',可以用这种更直观的方式:
$filename1 = "你的文件路径.txt" $lines = Get-Content $filename1 for ($i = 0; $i -lt $lines.Count - 2; $i++) { # 检查当前行是' 1',下下行是' 40',且中间行长度在2-4之间 if ($lines[$i] -eq ' 1' -and $lines[$i+2] -eq ' 40' -and $lines[$i+1].Length -ge 2 -and $lines[$i+1].Length -le 4) { $lines[$i+1].Trim() } }
关键说明
- 正则里的
\r?\n是为了兼容Windows(\r\n)和Linux(\n)的换行格式 - 如果你的目标行有特定字符限制(比如不能包含换行、特殊符号),可以把
.{2,4}改成更精准的规则,比如[^\r\n]{2,4}(表示不包含换行的2-4个字符) - 两种方式都可以批量处理所有符合条件的三行组,你可以根据自己的习惯选择
内容的提问来源于stack exchange,提问作者dome_engineer




