ファイルの内容を小文字に変換し、結果を同じファイルに保存します。

ファイルの内容を小文字に変換し、結果を同じファイルに保存します。

次のコマンドを使用して、入力ファイルの内容を小文字に変換します。

tr A-Z a-z < input > output 

このコマンドはうまく動作します。

ただし、入力ファイル自体に出力を保存しようとすると機能しません。コマンドを実行した後、入力ファイルは空です。なぜ?

 tr A-Z a-z < input > input 

答え1

GNUがあればsed使えます

sed -i 's/.*/\L&/' input
  • -iその場でファイルを修正
  • s/old/new/old使用。 。 。交換new
  • .*各行のすべての文字
  • \L小文字
  • &一致するパターン

答え2

ただし、入力ファイル自体に出力を保存しようとすると機能しません。コマンドを実行した後、入力ファイルは空です。なぜ?

これは、コマンドが実行される前にシェルがファイルを> input切り捨てるためです。trところで、高度な記述子処理を使用してこの問題を解決できますBash

exec 8<>input
exec 9<>input
tr '[A-Z]' '[a-z]' <&8 >&9

切り捨てなしで読み書きモードでディスクリプタとしてファイルを開きますexec #<>file#

関連情報