入力ファイルの上書き

入力ファイルの上書き

入力ファイルの内容を変換された出力に置き換えるソリューションには一時ファイルを使用するか、スポンジ便利です。

スティーブン・チャジェラス 回答これは、次のように読み書きモードでファイルを開く別の方法を示しています。

tr ' ' '\t' < file 1<> file

関連ファイルを壊さずに実際にどのように機能しますか?

答え1

これはtrファイルサイズが変更されないために機能します。

1<>filefileオーバーレイモードで標準出力として開きます。 (<>読み取り/書き込みモードと呼ばれますが、読み取るプログラムがほとんどないため、stdout実際に実行する作業に集中する方が便利です。)

通常、出力()をリダイレクトすると、>fileファイルは「書き込み」モードで開き、ファイルが作成または消去されます。別の一般的なオプションは、>>fileファイルの消去をスキップしてすべての出力を最後に置く「追加」モードです。1<>fileまた、ファイルの消去はスキップしますが、書き込みカーソルをファイルの先頭に配置します。 (デフォルトは代わりにリダイレクトなので、1これが必要です)。<>stdinstdout

このように正確に修正されるユーティリティはほとんどないため、これは時々便利です。別の場合は、置換長が元の長さとまったく同じ検索と置換です。 (より短い代替方法も機能しません。ファイルが終わりから切り取られていないためです。出力が元のファイルより短い場合、ファイルの終わりの内容はまだファイルの終わりで終わります。)

答え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がどのように同じファイルを指すことができますか?。同じファイルを複数回開く方法について説明します。

関連情報