You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:43:17