まひろ量子のハックログ

プログラミングや機械学習などの知識を記録・共有します

Linuxコマンドのリダイレクトで上書き保存できる?

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

うまく上書き保存されている。

Kozuko Mahiro's Hacklog ―― Copyright © 2018 Mahiro Kazuko