
入力ファイルの内容を変換された出力に置き換えるソリューションには一時ファイルを使用するか、スポンジ便利です。
スティーブン・チャジェラス 回答これは、次のように読み書きモードでファイルを開く別の方法を示しています。
tr ' ' '\t' < file 1<> file
関連ファイルを壊さずに実際にどのように機能しますか?
答え1
これはtr
ファイルサイズが変更されないために機能します。
1<>file
file
オーバーレイモードで標準出力として開きます。 (<>
読み取り/書き込みモードと呼ばれますが、読み取るプログラムがほとんどないため、stdout
実際に実行する作業に集中する方が便利です。)
通常、出力()をリダイレクトすると、>file
ファイルは「書き込み」モードで開き、ファイルが作成または消去されます。別の一般的なオプションは、>>file
ファイルの消去をスキップしてすべての出力を最後に置く「追加」モードです。1<>file
また、ファイルの消去はスキップしますが、書き込みカーソルをファイルの先頭に配置します。 (デフォルトは代わりにリダイレクトなので、1
これが必要です)。<>
stdin
stdout
このように正確に修正されるユーティリティはほとんどないため、これは時々便利です。別の場合は、置換長が元の長さとまったく同じ検索と置換です。 (より短い代替方法も機能しません。ファイルが終わりから切り取られていないためです。出力が元のファイルより短い場合、ファイルの終わりの内容はまだファイルの終わりで終わります。)
答え2
構文を使用してファイルを読み取り専用で開き、< file
ファイルの行を標準入力(STDIN、つまりファイル記述子0)として読み取る場合。次に、標準出力(STDOUT、つまりファイル記述子1)が読み取り+書き込み(1 <>)のために開き、それに応じて各行の内容が書き込まれます。
このセクションでは、I / O + Bashの詳細を読むことができます。第20章I/Oリダイレクト、「高度なBashスクリプトガイド」。
抜粋
[j]<>filename
# Open file "filename" for reading and writing,
#+ and assign file descriptor "j" to it.
# If "filename" does not exist, create it.
# If file descriptor "j" is not specified, default to fd 0, stdin.
#
# An application of this is writing at a specified place in a file.
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890
# Random access, by golly.
同じファイルを複数回開くとどうなりますか?
このU&L Q&Aでファイル記述子がどのように機能するかを確認してください。異なるプロセスの同じfdがどのように同じファイルを指すことができますか?。同じファイルを複数回開く方法について説明します。