> 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 🍺 /usr/local/Cellar/moreutils/0.55: 67 files, 740K
sponge reads standard input and writes it out to the specified file.
Unlike a shell redirect, sponge soaks up all its input before writing
the output file. This allows constructing pipelines that read from
and write to the same file.
I don’t understand. Please give me some useful examples.
What does soaks up mean?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Assume that you have a file named input, you want to remove all line start with # in input. You can get all lines don’t start with # using:
grep -v '^#' input
But how do you make changes to input? With standard POSIX toolchest, you need to use a temporary file, some thing like:
grep -v '^#' input >/tmp/input.tmp mv /tmp/input.tmp ./input
With shell redirection:
grep -v '^#' input >input
will truncate input before you reading from it.
With sponge, you can:
grep -v '^#' input | sponge input
Method 2
The moreutils home page itself documents a typical use case:
sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd
Here, /etc/passwd is both being written to and read to, and is being modified. Without sponging up stdin before writing, /etc/passwd might be corrupted (as the file changed during reading).
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0