Powershell相当于moreutils中的海绵?

nw.*_*nw. 6 powershell

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

有一个PowerShell等价,所以我可以在一个文件上工作,而不必管道到临时文件?

谢谢

Joe*_*ant 5

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

(Get-Content myFile) | Select-String 'MyFilter' | Set-Content myFile
Run Code Online (Sandbox Code Playgroud)

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

(Get-Content myFile | Select-String 'MyFilter') | Set-Content myFile
Run Code Online (Sandbox Code Playgroud)

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

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

(Get-Content myFile | Select-String 'MyFilter' | foreach { $_.tostring() }) | Set-Content myFile
Run Code Online (Sandbox Code Playgroud)