如何优雅实现C++前向声明排序去重?PowerShell脚本优化问询
优雅排序并去重C++前向声明的PowerShell方案
问题背景
我有一个包含约400行C++前向声明的大型头文件,结构示例如下:
namespace AnimalClothing
{
class Cat_Gloves;
class Dragon_Hat;
class Ant_Shoes;
class Lion_Glasses;
class Dragon_Hat;
...
}
需要按类名字母顺序排序并删除重复项以提升可读性,尝试ReSharper未找到可行方法,用PowerShell分两步处理后觉得流程太繁琐,希望找到更简洁的解决方案。
更优雅的PowerShell实现
方法一:直接整行处理(最简单高效)
无需创建自定义对象,直接对行进行过滤、排序和去重:
Get-Content forwardDeclarations.txt | ForEach-Object { $_.Trim() } | Where-Object { $_ -match '^class\s+\w+;' } | Sort-Object -Unique | Set-Content EndResult.txt
说明:
$_.Trim():去除每行前后的空格和缩进Where-Object:过滤出合法的前向声明行,排除空行或无效内容Sort-Object -Unique:直接按整行排序并去重——由于每行前缀都是class,排序时会自动按后续的类名字母顺序排列,同时自动剔除重复行- 最终输出的每行格式保持
class 类名;的正确顺序,无需二次处理
方法二:精准提取类名排序(更严谨)
如果需要更精准地按类名排序(比如行内有不规则空格),可以用正则提取类名后再重组输出:
Get-Content forwardDeclarations.txt | ForEach-Object { # 用正则匹配前向声明行,提取类名 if ($_ -match '^\s*class\s+(\w+);\s*$') { [PSCustomObject]@{ ClassName = $matches[1] # 提取类名字段 OriginalLine = $_.Trim() # 保留原始格式化行 } } } | Sort-Object ClassName -Unique | # 按类名排序并去重 Select-Object -ExpandProperty OriginalLine | # 只输出原始行内容 Set-Content EndResult.txt
说明:
- 正则
^\s*class\s+(\w+);\s*$精准匹配前向声明格式,确保只处理有效行 - 通过自定义对象绑定类名和原始行,既保证排序依据的准确性,又保留原始行的格式
- 一次管道完成所有操作,无需中间文件中转
原方案繁琐的原因
原方案分两次处理并生成中间文件,核心问题是第一次输出自定义对象时默认按属性名排序导致列顺序颠倒,需要二次修正。上面的方法通过直接处理行或精准控制输出内容,在一次管道流程中完成所有需求,大幅简化了操作。
内容的提问来源于stack exchange,提问作者Suslik
相关产品推荐
相关产品推荐

