moreutils 的海绵 - 与 shell 重定向有什么区别?有用的例子?

moreutils 的海绵 - 与 shell 重定向有什么区别?有用的例子?
> brew install moreutils                                                          
==> Downloading https://homebrew.bintray.com/bottles/moreutils-0.55.yosemite.bottle.tar.gz    
######################################################################## 100.0%               
==> Pouring moreutils0.55.yosemite.bottle.tar.gz       

答案1

假设您有一个名为 的文件input,您想要删除所有以#in开头的行input。您可以获得所有不以#以下方式开头的行:

grep -v '^#' input

但如何进行更改呢input?使用标准 POSIX 工具箱,您需要使用临时文件,例如:

grep -v '^#' input >/tmp/input.tmp
mv /tmp/input.tmp ./input

使用 shell 重定向:

grep -v '^#' input >input

input在您读取之前截断。

通过sponge,您可以:

grep -v '^#' input | sponge input

答案2

更多实用程序主页其本身记录了一个典型的用例:

sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd

此处,/etc/passwd 正在被写入和读取,并且正在被修改。如果在写入之前不清理标准输入,/etc/passwd 可能会损坏(因为文件在读取过程中发生更改)。

答案3

sponge我读过的最简单的例子:

$ cat file1 
I
You
Me
We
Us

要对其进行排序,您可以简单地

$ sort file1 > file1_sorted

但是,使用sponge,您可以读取和写入同一文件。

$ sort file1 | sponge file1

无需临时文件file1_sorted。这是因为sponge首先从 STDIN 读取,然后将其写出到STDOUT,在单独的步骤中,从而避免在读取过程中更改文件时损坏文件。

相关内容