首页 > 解决方案 > 使用 Powershell 删除相似的文本行

问题描述

我有一个文本文件,我想在其中使用 Powershell 删除任何包含类似文本的行。

文本的一个例子是

> *blah*1.my_parameter: 30
> *1.my_parameter: 40
> *blah*2.my_parameter: 30
> *2.my_parameter: 40

我想保留

> *blah*1.my_parameter: 30
> *blah*2.my_parameter: 30

并删除

 > *1.my_parameter: 40
 > *2.my_parameter: 40

我已经进行了很好的搜索并找到了 -match 和 Get-Unique 命令,但到目前为止似乎没有任何效果。提前感谢您的帮助

标签: powershell

解决方案


以下将起作用,但它会在大型输入文件上使用大量内存。这个想法是对匹配正则表达式的所有输入进行分组,按长度对组进行排序,然后选择降序排序结果中的第一个。

$reg = [Regex]::new('\*[\w.]+:')
Get-Content <testfile> | 
    Group-Object {([Regex]::Match($_, $reg)).Value} | 
    Select-Object Group |
    Foreach-Object {
        $_.Group | 
        Sort-Object -Descending $_.length | 
        Select-Object -First 1
    }

测试

$test = @(
    '> *blah*1.my_parameter: 30'
    , '> *1.my_parameter: 40'
    , '> *blah*2.my_parameter: 30'
    , '> *2.my_parameter: 40'
)

$reg = [Regex]::new('\*[\w.]+:')
$test | group {([Regex]::Match($_, $reg)).Value} | % {($_.group | sort le*)[-1]}

输出

> *blah*1.my_parameter: 30
> *blah*2.my_parameter: 30

推荐阅读