echo "今日も1日がんばるぞい" > a cat a > a cat a # a に書かれていた文字列はきえてしまう。。。
あるファイルをリダイレクトで上書きできるのだろうか? 結論から言うとできない。上の例で書いたように、リダイレクト後のファイルは中身が空になる。
少し考えて、こういうのを思いついた。
echo "今日も1日がんばるぞい" > a cat a | (cat > _ && mv _ a) cat a 今日も1日がんばるぞい
今度は空にならず文字列が残っている。一時ファイルとして _ という名前のファイルにリダイレクトし、その直後に _ を もとのファイル名にリネームしている。これなら問題ない。
ただ、毎回こう書いていては面倒なので、関数にして短く書けるようにした。
~/.bashrc
に以下を追記した。
saveas() { # Usage: cat foo | saveas foo cat > _ && mv _ $1 }
~/.bashrc
を再読込みすると、saveasコマンドが使えるようになる。
使い方はこうだ。
cat a | saveas a
試しに、色々実験してみた。
echo "今日も1日がんばるぞい" > a cat a | perl -pe "s/ぞい/ZOI/g" | saveas a cat a 今日も1日がんばるZOI
うまく上書き保存されている。