次のコマンドを使用して、入力ファイルの内容を小文字に変換します。
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
。#