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