web-dev-qa-db-ja.com

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       
????  /usr/local/Cellar/moreutils/0.55: 67 files, 740K   

スポンジは標準入力を読み取り、それを指定されたファイルに書き込みます。シェルリダイレクトとは異なり、スポンジは出力ファイルを書き込む前にすべての入力を吸収します。これにより、同じファイルを読み書きするパイプラインを構築できます。

分からない。役立つ例をいくつか挙げてください。

soaks upはどういう意味ですか?

17
Ivanov

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
35
cuonglm

moreutilsホームページ 自体は、典型的な使用例を文書化しています。

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

ここで、/ etc/passwdは書き込みと読み取りの両方が行われており、変更されています。書き込み前にstdinを改ざんしないと、/ etc/passwdが破損する可能性があります(読み取り中にファイルが変更されたため)。

9
Chris Down