首页 > 解决方案 > 从文件中删除与模式匹配的所有行,除了第一次出现

问题描述

我有一个如下所示的 .txt 文件目录:

[LINETYPE]S[STARTTIME]00:00:00
[LINETYPE]P[开始时间]00:00:00
[LINETYPE]B[开始时间]00:59:00
[LINETYPE]C[开始时间]00:59:00
[LINETYPE]C[开始时间]00:59:30
[LINETYPE]S[STARTTIME]01:00:00
[LINETYPE]P[开始时间]01:00:00
[LINETYPE]B[开始时间]01:59:00
[LINETYPE]C[开始时间]01:59:00
[LINETYPE]C[开始时间]01:59:30
[LINETYPE]S[STARTTIME]02:00:00

我想删除[LINETYPE]S除第一个之外的所有出现,它恰好总是 00:00:00 并且在第一行,然后将文件重新保存到新位置。

也就是说,必须始终存在,但需要删除以[LINETYPE]S[STARTTIME]00:00:00开头的其他行。[LINETYPE]S

这就是我想出的,除了删除所有[LINETYPE]S行,包括第一行之外,它的工作原理。谷歌搜索了一段时间后,我似乎无法弄清楚如何做那部分,所以我希望有人能指出我正确的方向。谢谢你的帮助!

Get-ChildItem "C:\Users\Me\Desktop\Samples" -Filter *.txt | ForEach-Object {
    Get-Content $_.FullName | Where-Object {
        $_ -notmatch "\[LINETYPE\]S"
    } | Set-Content ('C:\Users\Me\Desktop\Samples\Final\' + $_.BaseName + '.txt')
}

标签: windowspowershell

解决方案


我不知道如何通过管道 [ blush ] 做到这一点,所以我进行了foreach循环和复合测试。

# fake reading in a text file
#    in real life, use Get-Content
$InStuff = @'
[LINETYPE]S[STARTTIME]00:00:00
[LINETYPE]P[STARTTIME]00:00:00
[LINETYPE]B[STARTTIME]00:59:00
[LINETYPE]C[STARTTIME]00:59:00
[LINETYPE]C[STARTTIME]00:59:30
[LINETYPE]S[STARTTIME]01:00:00
[LINETYPE]P[STARTTIME]01:00:00
[LINETYPE]B[STARTTIME]01:59:00
[LINETYPE]C[STARTTIME]01:59:00
[LINETYPE]C[STARTTIME]01:59:30
[LINETYPE]S[STARTTIME]02:00:00
'@ -split [System.Environment]::NewLine

$KeepFirst = '[LINETYPE]S'

$FoundFirst = $False
$FilteredList = foreach ($IS_Item in $InStuff)
    {
    if ($IS_Item.StartsWith($KeepFirst))
        {
        if (-not $FoundFirst)
            {
            $IS_Item
            $FoundFirst = $True
            }
        }
        else
        {
        $IS_Item
        }
    }

$FilteredList

输出 ...

[LINETYPE]S[STARTTIME]00:00:00
[LINETYPE]P[STARTTIME]00:00:00
[LINETYPE]B[STARTTIME]00:59:00
[LINETYPE]C[STARTTIME]00:59:00
[LINETYPE]C[STARTTIME]00:59:30
[LINETYPE]P[STARTTIME]01:00:00
[LINETYPE]B[STARTTIME]01:59:00
[LINETYPE]C[STARTTIME]01:59:00
[LINETYPE]C[STARTTIME]01:59:30

此时,您可以将新集合发送到文件中。[咧嘴笑]


推荐阅读