使用Powershell删除类似的文本行

使用Powershell删除类似的文本行,powershell,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:

我有一个文本文件,希望使用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命令,但到目前为止似乎没有任何效果。
提前感谢您提供的任何帮助

以下内容可以正常工作,但在大型输入文件上会占用大量内存。 其思想是将所有输入分组到一个匹配的正则表达式上,根据长度对组进行排序,并选择降序排序结果中的第一个

$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

下面的方法可以工作,但在大的输入文件上会占用大量内存。 其思想是将所有输入分组到一个匹配的正则表达式上,根据长度对组进行排序,并选择降序排序结果中的第一个

$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

要删除的行始终以*和一个数字开头,而其他行则不以*和数字开头?是否有任何特定的原因要使用Powershell?可能不是这类工作的最佳工具。同样正如Doug所说,你必须给出一个更清晰的例子,让我们知道匹配的确切规则,以及保留哪一个,例如,在两个匹配中,是否有较长的匹配?我们如何分割生产线以寻找您想要匹配的零件?同时发布你到目前为止所拥有的内容,并解释哪些内容不起作用,这将改善问题。如果你的陈述“包含类似文本的行”是正确的,那么每一行都应该保留,因为它们都有相似的模式。我想做的是看到最后*和:符号之间有两行相同的文本。因此,在示例中,文本行1和2将是匹配的,因为它们都包含1.my_参数。然后我想保留较长的行*blah*1.my_参数,删除较短的行*1.my_参数。我在这里使用Powershell作为我创建的WPF的一部分。我愿意接受关于不同工作工具的建议。我建议您给它们命名一些比
*blah*2更有意义和区别的名称。我的_参数
*2。我的_参数
要删除的行总是以*和一个数字开头,而其他行则不以*开头。您想为此使用Powershell吗?可能不是这类工作的最佳工具。同样正如Doug所说,你必须给出一个更清晰的例子,让我们知道匹配的确切规则,以及保留哪一个,例如,在两个匹配中,是否有较长的匹配?我们如何分割生产线以寻找您想要匹配的零件?同时发布你到目前为止所拥有的内容,并解释哪些内容不起作用,这将改善问题。如果你的陈述“包含类似文本的行”是正确的,那么每一行都应该保留,因为它们都有相似的模式。我想做的是看到最后*和:符号之间有两行相同的文本。因此,在示例中,文本行1和2将是匹配的,因为它们都包含1.my_参数。然后我想保留较长的行*blah*1.my_参数,删除较短的行*1.my_参数。我在这里使用Powershell作为我创建的WPF的一部分。我愿意接受关于不同工作工具的建议。我建议你给它们命名一些比
*blah*2更有意义和区别的东西。我的_参数和
*2。我的_参数正是我想要的,非常感谢。我一直在看regex,但仍然在想它是如何工作的,这对我帮助很大。我是自学成才的PowerShell用户,从Stack Overflow社区学到了很多东西。我希望有一天能有知识贡献,也欢迎你。我只是要求加入,因为我非常确定语法仍然可以大幅缩短,但我自己不能再进一步缩短它了。@AnchorEyes-缩短了很多-
sort-d{$\u.length}sort-un{$\u-match'\*[\w.]+:';$matches[0]}
这正是我想要的,非常感谢。我一直在看regex,但仍然在想它是如何工作的,这对我帮助很大。我是自学成才的PowerShell用户,从Stack Overflow社区学到了很多东西。我希望有一天能有知识贡献,也欢迎你。我只是要求加入,因为我非常确定语法仍然可以大幅缩短,但我自己不能再进一步缩短它了。@AnchorEyes-缩短了很多-
sort-d{$\u.length}sort-un{$\u-match'\*[\w.]+:';$matches[0]}