【问题标题】:remove empty lines from text file with PowerShell使用 PowerShell 从文本文件中删除空行
【发布时间】:2022-04-28 23:13:15
【问题描述】:

我知道我可以使用:

gc c:\FileWithEmptyLines.txt | where {$_ -ne ""} > c:\FileWithNoEmptyLines.txt

删除空行。但是如何使用“-replace”删除它们?

【问题讨论】:

  • 为什么要替换?并努力提高你的接受率
  • 我的回答删除了带有-replace comparison operator 的空行。 Get-Content 没有替换参数,所以我假设您正在寻找一种使用运算符的方法。

标签: powershell text-files lines


【解决方案1】:

我在这里找到了一个不错的班轮>>http://www.pixelchef.net/remove-empty-lines-file-powershell。刚刚用几个空白行进行了测试,包括只有换行符以及只有空格、只有制表符和组合的行。

(gc file.txt) | ? {$_.trim() -ne "" } | set-content file.txt

有关代码的一些注释,请参见原文。不错:)

【讨论】:

  • 我认为总的来说我更喜欢(gc file.txt) | ? { -not $_.IsNullOrWhiteSpace() } | set-content file.txt,因为它更清楚地表达了意图,但它相当于同一件事。
  • 一目了然,我的字符串上似乎没有“IsNullOrWhiteSpace()”方法......而且......实例方法如何检查null?不过,发布的答案效果很好!
  • IsNullOrWhiteSpace 是来自 System.String 对象的静态方法,在 PowerShell 中调用它的正确方法如下:[String]::IsNullOrWhiteSpace({your string})。基于 Neil Barnwell 评论的正确命令行如下:(gc file.txt) | ? { -not [String]::IsNullOrWhiteSpace($_) } | set-content file.txt
【解决方案2】:

Randy Skretka 的这段代码对我来说运行良好,但我遇到了问题,文件末尾仍有换行符。

(gc file.txt) | ? {$_.trim() -ne "" } | set-content file.txt

所以我最后添加了这个:

$content = [System.IO.File]::ReadAllText("file.txt")
$content = $content.Trim()
[System.IO.File]::WriteAllText("file.txt", $content)

【讨论】:

    【解决方案3】:

    如果您还想排除仅包含空格字符的文件,则可以使用 -match 代替 -eq:

    @(gc c:\FileWithEmptyLines.txt) -match '\S'  | out-file c:\FileWithNoEmptyLines
    

    【讨论】:

      【解决方案4】:

      没有专门使用-replace,但是使用-notmatch 和正则表达式解析内容会得到相同的效果。

      (get-content 'c:\FileWithEmptyLines.txt') -notmatch '^\s*$' > c:\FileWithNoEmptyLines.txt
      

      【讨论】:

      • 这很有魅力。我试图从文件中删除 VB6 cmets,这是我使用的最后一个命令 - (Get-Content -Path ".\vbXML.cls") -replace "\'.*$", "" -notmatch "^\s*$" | Out-File ".\vbXML.uncommented.cls" -Append
      【解决方案5】:

      要使用 RegEx 解决此问题,您需要使用多行标志 (?m):

      ((Get-Content file.txt -Raw) -replace "(?m)^\s*`r`n",'').trim() | Set-Content file.txt
      

      【讨论】:

        【解决方案6】:

        如果你真的想从文件中过滤空行,那么你可以试试这个:

        (gc $source_file).Trim() | ? {$_.Length -gt 0}

        【讨论】:

          【解决方案7】:

          你不能做替换,你必须用 SOMETHING 替换 SOMETHING,而且你两者都没有。

          【讨论】:

          • Poowershell 是否支持 -remove "" 删除员工行?
          • 不,它似乎不支持“-remove”。
          • 你说的是苹果和橘子。删除和替换显然不同。你所拥有的基本上可以工作,但也许你正在尝试重建现有文件但没有空白。 PS C:\> $text=get-content a.txt PS C:\> $text |其中{$_} |输出文件 a.txt
          【解决方案8】:

          这将删除空行或仅包含空白字符(制表符/空格)的行。

          [IO.File]::ReadAllText("FileWithEmptyLines.txt") -replace '\s+\r\n+', "`r`n" | Out-File "c:\FileWithNoEmptyLines.txt"
          

          【讨论】:

            【解决方案9】:
            (Get-Content c:\FileWithEmptyLines.txt) | 
                Foreach { $_ -Replace  "Old content", " New content" } | 
                Set-Content c:\FileWithEmptyLines.txt;
            

            【讨论】:

              【解决方案10】:

              文件

              PS /home/edward/Desktop> Get-Content ./copy.txt

              [桌面​​入口]

              名称=口径 Exec=~/Apps/calibre/calibre

              图标=~/Apps/calibre/resources/content-server/calibre.png

              类型=应用程序*


              首先从文件中获取内容并修剪文本文档的每一行中的空格。这成为传递给 where-object 的对象,以通过数组查看字符串长度大于 0 的数组的每个成员。传递该对象以替换您开始使用的文件的内容。制作一个新文件可能会更好...... 最后要做的是读回新制作的文件的内容,看看你的真棒。

              (Get-Content ./copy.txt).Trim() | Where-Object{$_.length -gt 0} | Set-Content ./copy.txt

              Get-Content ./copy.txt

              【讨论】:

              • >修复 ~/ 路径到完整路径的错误,因为这个文件应该有这里是奖励(Get-Content ./copy.txt).Replace("~/","/home/edward/") | Set-Content ./copy.txt
              【解决方案11】:

              这会从 file.txt 中删除尾随空格和空行

              PS C:\Users\> (gc file.txt) | Foreach {$_.TrimEnd()} | where {$_ -ne ""} | Set-Content file.txt
              

              【讨论】:

                【解决方案12】:

                Get-Content 返回不可变的行数组。您可以将其转换为可变数组并通过索引删除必要的行。您可以通过 match 获得特定的 indexex。之后,您可以使用 Set-Content 将结果写入新文件。使用这种方法,您可以避免当您尝试用“”替换 smthing 时 powershell 替换工具留下的空行。请注意,我不保证完美的性能。我不是专业的PowerShell开发人员))

                $fileLines = Get-Content $filePath
                $neccessaryLine = Select-String -Path  $filePath -Pattern 'something'
                if (-Not $neccessaryLine) { exit }
                $neccessaryLineIndex = $neccessaryLine.LineNumber - 1
                $updatedFileContent = [System.Collections.ArrayList]::new($fileLines)
                $updatedFileContent.RemoveAt($neccessaryLineIndex)
                $updatedHostsFileContent.RemoveAt($domainInfoLineIndex - 1)
                $updatedHostsFileContent | Set-Content $hostsFilePath
                

                【讨论】:

                  【解决方案13】:
                  Set-Content -Path "File.txt" -Value (get-content -Path "File.txt" | Select-String -Pattern '^\s*$' -NotMatch)  
                  

                  这对我有用,最初是从这里得到的,并添加了 Joel 建议的 '^\s*$':Using PowerShell to remove lines from a text file if it contains a string

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-11-01
                    • 1970-01-01
                    • 2023-03-30
                    • 1970-01-01
                    相关资源
                    最近更新 更多