「read」がファイル全体を一度に読み取れるように、「read」の「区切り文字」として機能する文字がありますか?

「read」がファイル全体を一度に読み取れるように、「read」の「区切り文字」として機能する文字がありますか?

Bashマニュアルのread組み込みコマンドについて

-d delimの最初の文字は、delim改行文字ではなく入力行を終了するために使用されます。

(文字であるEOFと一致しない限り)、一致せずに常にファイル全体を一度に読み取るようにdelim文字を指定できますか?readread

ありがとうございます。

ベストアンサー1

bashとにかく変数にNULバイトを格納できないため、いつでも次のことができます。

IFS= read -rd '' var < file

ファイルにNULバイトがない場合、最初のNULバイトまたはファイルの終わりまでファイルの内容を保存します(定義によるテキストファイル(少なくともPOSIX定義による)はNULバイトを含みません)。

別のオプションは、ファイルの内容を行配列(行区切り文字を含む)として保存することです。

readarray array < file

その後、次のことで参加できます。

IFS=; var="${array[*]}"

入力に ​​NUL バイトが含まれていると、各行の最初の項目以降のすべての項目が失われます。

POSIX sh構文では、次のことができます。

var=$(cat < file; echo .); var=${var%.}

我々は、.コマンド置換がすべての末尾の改行を削除するという事実を説明するために1つを追加してから削除しました。

ファイルにNULバイトが含まれている場合、動作は実装ごとに異なります。zshこれを保持する唯一のシェルです(また、変数にNULバイトを格納できる唯一のシェルでもあります)。bash一部の他のシェルはそれを削除し、他のシェルはそれをブロックし、最初のNULが発生した後にすべてを破棄します。

次のように、いくつかのエンコーディングでファイルの内容を保存することもできます。

var=$(uuencode -m - < file)

次の方法で再インポートします。

printf '%s\n' "$var" | uudecode

または、パラメータで使用\0000できるようにNULでエンコードします(文字セットBIG5、GB18030、GBK、BIG5-HKCSCのロケールを使用しないと仮定)。printf %bbash

var=; while true; do
  if IFS= read -rd '' rec; then
    var+=${rec//\\/\\\\}\\0000
  else
    var+=${rec//\\/\\\\}
    break
  fi
done < file

それから:

printf %b "$var"

再インポート。

おすすめ記事