使用PowerShell删除文本文件的顶行-但仅当它为空时

lsmepo6l  于 12个月前  发布在  Shell
关注(0)|答案(4)|浏览(151)

我知道我可以用途:
Get-ChildItem .txt| ForEach-Object {(get-Content $)|Where-Object {(1)-notcontains $.ReadCount }|设置内容路径$_ }
删除文件的第一行,但我只想在该行为空白或以空格开头时这样做。
我尝试了各种选项,包括:Get-ChildItem .txt| ForEach-Object {(get-Content $)|Where-Object {(1)-ne““}| Set-Content -path $
}(我觉得关键在Where-Object语句中)-但我的PS不是很好。
似乎有很多关于删除所有空行的帖子,但没有关于只有第一个条件的帖子。
会很感激你的帮助。

zphenhs4

zphenhs41#

(Get-ChildItem *.txt) | ForEach{
    ($_ | Get-Content -Raw) -replace '^\s[^\n\r]*[\n\r]{1,2}' | Set-ConTent $_.FullName -NoNewLine
}

字符串
我把 *.
你也可以通过在Filter中 Package pipeline操作并使用pipeline变量来获得直管道:

Filter StripSelected {
    $_ -replace '^\s[^\n\r]*[\n\r]{1,2}'
}

Get-ChildItem *.txt -pv pvFileInfo |
  Get-Content -Raw | StripSelected |
Set-ConTent $pvFileInfo.FullName -NoNewLine

68de4m5k

68de4m5k2#

这其实应该足够了:

Get-ChildItem -Filter *.txt | 
ForEach-Object {
    $Content = Get-Content -Path $_.FullName
    if ($Content[0] -match '^\s|^$' ) {
        $NewContent = @($Content[1..($Content.Count - 1)] ) -join "`r`n"
        [system.io.file]::WriteAllText($_.FullName, $NewContent,[text.encoding]::UTF8)
    } 
}

字符串

s71maibg

s71maibg3#

我会这样做,使用一个StreamReader,以避免阅读所有文件的内容时,可能不需要。

Get-ChildItem *.txt | ForEach-Object {
    try {
        # open a StreamReader
        $reader = $_.OpenText()

        # if the first line matches any non whitespace character
        if ($reader.ReadLine() -match '\S') {
            # go to the next file
            return
        }

        # else, read all content (skipping the first line)
        $content = $reader.ReadToEnd()
    }
    catch {
        Write-Warning $_
        return
    }
    finally {
        if ($reader) {
            # dispose the reader
            $reader.Dispose()
        }
    }

    # and write back to the file
    $content | Set-Content $_.FullName
}

字符串

qco9c6ql

qco9c6ql4#

显示的代码是问题不是有效的PowerShell代码。此代码将遍历由Get-ChildItem标识的文件,使用[string]::IsNullOrWhiteSpace确定第一行是否符合条件,然后设置要适当跳过的行数。

Get-ChildItem -Path .\WW*.TXT |
    ForEach-Object {
        $FirstLine = Get-Content -Path $_ -First 1
        if ([string]::IsNullOrWhiteSpace($FirstLine)) {
            (Get-Content -Path $_) | Select-Object -Skip 1 | Out-File -Path $_
        }
    }

字符串

相关问题