標準入力またはファイルをバッファリングできるプログラム

標準入力またはファイルをバッファリングできるプログラム

一時ファイルを使用する以外に入力をバッファリングできますが、インポート中にstdinエラーが発生する方法/プログラムはありますかEOF?また、シェル変数(例:)を使用したくありませんbuffer=$(cat)

プログラムは次のようになります(プログラム名があると仮定buffered-cat)。

$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)

これでプログラムはそれを受け取り^Dbuffered-cat内容を出力します。

line 1
line 2
line 3

答え1

あなたはこれを行うことができますspongemoreutilsからsponge「標準入力を受け取り、ファイルに書き込みます」。引数がない場合、ファイルは標準出力です。コマンドへの入力はEOFまでメモリに保存され、一度にすべて書き込まれます。

通常のファイルに書き込むには、ファイル名を指定するだけです。

cmd | sponge filename

主な目的spongeは、パイプから同じファイルを読み書きできるようにすることですが、ユーザーの要件にも適している可能性があります。

答え2

貧しい人々がsponge使用していますawk

awk '{a[NR] = $0} END {for (i = 1; i <= NR; i++) print a[i]}'

お持ちの場合tac、これを乱用する可能性があります。

... | tac | tac

答え3

入力がASCIIテキスト(最後までNUL 0x0バイトを含まない)の場合は、必要な操作をsed -z実行してください。

$ sed -z ''
Line 1
Line 2
Line 3
^D
Line 1
Line 2
Line 3
$ 

-zsedNULバイトが通常の改行文字ではなく行区切り文字として扱われる理由です。したがって、入力がNULバイトのないプレーンテキストの場合、sedはEOFに達するまで入力全体をモードバッファに読み込み続けます。 sedその後、バッファに対して何もせずに出力します。


入力にNULバイトがある場合は、次のことができます。

sed ':l;N;bl'

答え4

Pythonを除いて、muruのawkの例と同じアイデアです。CtrlD1行ずつ読み取りを停止するために使用されます。

$ python -c 'import sys;print("".join(sys.stdin.readlines()))'                                                           
line1
line2
line3 # press Enter and Ctrl+D at this point
line1
line2
line3

関連情報