moreutilsスポンジ - シェルリダイレクトとの違いは何ですか?便利な例?

moreutilsスポンジ - シェルリダイレクトとの違いは何ですか?便利な例?
> 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

というファイルがあり、inで始まるinputすべての行を削除したいとします。次に開始しないすべての行を取得できます。#input#

grep -v '^#' input

しかし、どのように変更しますかinput?標準のPOSIXツールボックスでは、次の一時ファイルを使用する必要があります。

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

シェルリダイレクトを使用します。

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別のステップに書き込まれ、読み取り中にファイルが変更された場合にファイルが破損するのを防ぎます。

関連情報