> 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
,在单独的步骤中,从而避免在读取过程中更改文件时损坏文件。