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


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

分かりません。便利な例をいくつか教えてください。

何を吸い上げるを意味ですか?



別の例はexpand foo.txt | sponge foo.txtです。関連項目:stackoverflow.com/a/33639324/1959808
Ioannis Filippidis

回答:


32

という名前のファイルがあると仮定し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

4
実際には、<>演算子を使用してバイトが変換されている限り、ファイルを安全に同時に読み書きできます。
クリスダウン

@ChrisDown:はい、私はそれをせずに意味がcorroupt
cuonglm

「腐敗させる」ことについてあなたが何を言っているのか分かりません。><<>は異なり、何かが本当にうまくいかない限り、ファイルは破損しません。あなたはそれを使用してバイト単位で非常に簡単に書くことができます。たとえば、で使用してみてくださいtr
クリスダウン

@ChrisDown:混乱を避けるためにその文を削除しましょう。実際、を使用するときは<>file、読み取りと書き込みのためにファイルを開きますが、実際にはファイルには何も書き込みません。
クオンルム

1
@ChrisDownが作成しようとしている点<>は、ファイルを切り捨てず、単に既存のバイトを新しい出力で置き換えるだけだと思います。新しい出力が短すぎる場合、ファイルの最後に残ったゴミがあります。しかし、新しい出力が十分に長ければ、リスクはありません。
BallpointBen

7

moreutilsホームページ自体は、典型的なユースケースを文書化:

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

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


そして、もしあなたがした方法を説明していたなら、moreutilsページの良い例でしょう:-)
Br.Bill
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.