【问题标题】:Powershell equivalent to sponge in moreutils?Powershell相当于moreutils中的海绵?
【发布时间】:2011-07-07 01:22:43
【问题描述】:

有一个名为 sponge 的 GNU 程序,它会在写入文件之前吸收输入,因此您可以执行以下操作:cat myFile | grep "myFilter" | sponge myFile

是否有等效的 powershell,所以我可以就地处理文件,而不必通过管道传输到临时文件?

谢谢

【问题讨论】:

  • 如果您可以提供示例输入,然后提供海绵结果的预期输出,这可能会有所帮助。
  • @Scott:它只是缓冲所有内容,直到输入停止,然后写入。

标签: powershell


【解决方案1】:

在 Powershell 中,明智地使用括号将强制操作在将数据传递给管道中的下一个命令之前完全完成。管道Get-Content 的默认设置是逐行传递到下一个命令,但在继续之前,它必须形成一个完整的数据集(例如,加载所有行):

(Get-Content myFile) | Select-String 'MyFilter' | Set-Content myFile

另一种可能使用更少内存的替代方法(我没有对其进行基准测试)是只强制 Select-String 的结果在继续之前完成:

(Get-Content myFile | Select-String 'MyFilter') | Set-Content myFile

您还可以将事物分配给变量作为附加步骤。任何技术都会将内容加载到 Powershell 会话的内存中,因此请小心处理大文件。

附录: Select-String 返回 MatchInfo 对象。使用Out-File 会添加令人讨厌的额外空行,因为它尝试将结果格式化为字符串,但Set-Content 在写入时正确地将每个对象转换为自己的字符串,从而产生更好的输出。由于您来自 *nix 并且习惯于所有返回字符串(而 Powershell 返回对象),因此强制字符串输出的一种方法是通过 foreach 将它们转换为管道:

(Get-Content myFile | Select-String 'MyFilter' | foreach { $_.tostring() }) | Set-Content myFile

【讨论】:

    【解决方案2】:

    你可以试试这个:

    (Get-content myfile) | where {$_ -match "regular-expression"} | Set-content myfile
    

    ${full-path-file-name-of-myfile} | where {$_ -match "regular-expression"} | add-content Anotherfile
    

    更容易记住

    【讨论】:

      【解决方案3】:

      我想到了另外两种方法——它们实际上都是一样的,只是一种是函数,另一种是在命令行上。 (我不知道 unix 上的海绵,所以我不能肯定他们模仿它)。

      这是命令行中的第一个

      Get-Content .\temp.txt | 
          Select-String "grep" | 
          foreach-object -begin { [array] $out  = @()} -process { $out = $out + ($_.tostring())} -end {write-output $out}
      

      第二个是两个创建一个函数来做它

      function sponge {
          [cmdletbinding()]
          Param(
              [Parameter(
                  Mandatory = $True,
                  ValueFromPipeline = $True)]
              [string]$Output
          )
          Begin {
              [array] $out = @()
          }
          Process {
              $out = $out + $Output
          }
          End {
              Write-Output $Out
          }
      }
      
      
      Get-Content .\temp2.txt | Select-String "grep" | sponge
      

      HTH, 马特

      【讨论】:

        猜你喜欢
        • 2016-02-11
        • 2012-01-13
        • 2022-11-30
        • 1970-01-01
        • 2011-12-09
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        • 2011-07-29
        相关资源
        最近更新 更多