如何用PowerShell提取每行第3个空格到第3个连字符间的文本?
PowerShell 实现指定分隔符位置的文本提取
需求背景
有一个多行文本文件,示例内容如下:
BALL - A 5122-ABCD-STH-PC2016/A 5122 : It's a duplicate. CIRCLE - B 612-DEFGH-STH-LAPTOP2005/B 612 : It's a duplicate.
需要提取每行中第3个空格与第3个连字符(该连字符位于第3个空格之后)之间的文本(不含分隔符),处理后预期结果:
5122-ABCD 612-DEFGH
已有类Unix工具的参考实现:
# sed 实现 cat file.txt | sed -E 's/^([^ ]*[ ]){3}//' | sed -E 's/(^([^-]*[-]){1}[^-]*).*/\1/' # awk 实现 cat file.txt | awk -F' ' '{print $4}' | awk -F'-' '{print $1 "-" $2}' # cut 实现 cat file.txt | cut -d ' ' -f 4- | cut -d '-' -f -2
理想的PowerShell实现要求:
- 支持通过参数指定空格和连字符的目标出现次数(而非硬编码)
- 兼容所有PowerShell版本
兼容全版本的PowerShell解决方案
方案1:基于字符串分割的自定义函数
通过字符串分割与拼接实现,无需依赖高版本特性,兼容PowerShell 2.0及以上:
function Extract-TextBetweenDelimiters { [CmdletBinding()] param( [Parameter(Mandatory, ValueFromPipeline)] [string[]]$InputObject, [int]$SkipSpaceCount = 3, # 要跳过的空格分隔段数量 [int]$CaptureDashCount = 3 # 要截取到的连字符位置(位于空格之后) ) process { foreach ($line in $InputObject) { # 跳过前N个空格分隔的内容,保留剩余部分 $afterSpaces = $line -split ' ', ($SkipSpaceCount + 1) | Select-Object -Last 1 # 按连字符分割,截取到第M个连字符之前的内容 $dashSegments = $afterSpaces -split '-' if ($dashSegments.Count -ge $CaptureDashCount) { # 拼接前(M-1)个分割段 ($dashSegments[0..($CaptureDashCount - 2)] -join '-') } else { # 若连字符数量不足,返回空格后的全部内容 $afterSpaces } } } }
使用示例
处理目标文本文件:
Get-Content .\file.txt | Extract-TextBetweenDelimiters -SkipSpaceCount 3 -CaptureDashCount 3
执行后输出:
5122-ABCD 612-DEFGH
方案2:动态正则表达式实现
通过动态生成正则表达式匹配目标内容,同样兼容全版本:
function Extract-TextWithRegex { [CmdletBinding()] param( [Parameter(Mandatory, ValueFromPipeline)] [string[]]$InputObject, [int]$SkipSpaceCount = 3, [int]$CaptureDashCount = 3 ) process { foreach ($line in $InputObject) { # 生成正则:跳过前N个空格分隔的内容 $spacePattern = "^(?:[^ ]+ ){$SkipSpaceCount}" # 生成正则:匹配到第M个连字符之前的所有内容 $dashPattern = "^(?:[^-]+-){$($CaptureDashCount - 1)}[^-]+" # 先移除前N个空格的内容,再提取目标片段 $trimmedLine = $line -replace $spacePattern, '' if ($trimmedLine -match $dashPattern) { $matches[0] } } } }
使用示例
Get-Content .\file.txt | Extract-TextWithRegex -SkipSpaceCount 3 -CaptureDashCount 3
内容的提问来源于stack exchange,提问作者Smeterlink
相关产品推荐
相关产品推荐

