如何通过PowerShell将文本中的范围标识填充为完整序列?
PowerShell 展开范围型文本(如C1-C5转为C1,C2,C3,C4,C5)
需求:把文本中的范围格式(如
C1-C5,C10-C12)展开为逐个枚举的项,最终输出C1,C2,C3,C4,C5,C10,C11,C12。
目前已尝试将文本中的-替换为..,但不知道如何利用..填充中间数值。
不用先替换-为..,直接针对每个范围项提取前缀和数字区间,利用PowerShell的范围运算符生成完整序列即可,具体实现如下:
- 读取目标文本文件的完整内容
- 按逗号分割成独立的范围项
- 对每个范围项,用正则匹配提取前缀(如
C)、起始数字、结束数字 - 用
..生成连续数字范围,逐个拼接前缀得到完整项 - 将所有展开后的项用逗号连接,写回文件
完整代码示例
# 读取文件内容(-Raw确保一次性读取全部内容) $content = Get-Content -Path C:\Users\person\Desktop\test\test.txt -Raw # 处理每个范围项,展开成单个条目 $expandedItems = $content -split ',' | ForEach-Object { # 正则匹配前缀、起始数、结束数,兼容前缀相同的范围格式 if ($_ -match '^([A-Za-z]+)(\d+)-\1?(\d+)$') { $prefix = $matches[1] $startNum = [int]$matches[2] $endNum = [int]$matches[3] # 生成数字范围并拼接前缀 ($startNum..$endNum) | ForEach-Object { "$prefix$_" } } else { # 非范围格式的内容直接保留 $_ } } # 将展开后的结果用逗号连接,写入原文件 $expandedItems -join ',' | Set-Content -Path C:\Users\person\Desktop\test\test.txt # 查看处理后的结果 Get-Content -Path C:\Users\person\Desktop\test\test.txt
代码说明
-Raw参数:避免把文件内容拆分成多行数组,保证按完整字符串处理- 正则表达式
^([A-Za-z]+)(\d+)-\1?(\d+)$:专门匹配前缀相同的范围(如C1-C5),\1确保前后前缀一致 $startNum..$endNum:PowerShell的范围运算符,直接生成连续数字序列- 兼容非范围项:如果文本里有单独的
C13这类条目,会直接保留不处理
内容的提问来源于stack exchange,提问作者Luke Shurtleff
相关产品推荐
相关产品推荐

