A program that could buffer stdin or file
You can do this with sponge
from moreutils. sponge
will "soak up standard input and write to a file". With no arguments, that file is standard output. Input given to this command is stored in memory until EOF, and then written out all at once.
For writing to a normal file, you can just give the filename:
cmd | sponge filename
The main purpose of sponge
is to allow reading and writing from the same file within a pipeline, but it does what you want as well.
A poor man's sponge
using awk
:
awk '{a[NR] = $0} END {for (i = 1; i <= NR; i++) print a[i]}'
If you have tac
, you can misuse it too:
... | tac | tac
As long as your input is ASCII text (contains no NUL 0x0 bytes until the end), then sed -z
does what you want:
$ sed -z ''
Line 1
Line 2
Line 3
^D
Line 1
Line 2
Line 3
$
The -z
causes sed
to treat the NUL byte as a line delimiter instead of the usual newline. So as long as your input is regular text with no NUL bytes, then sed will continue reading the whole input into its pattern buffer until EOF is reached. sed
then does no processing on the buffer and outputs it.
If NUL bytes are present in your input, then you can do this instead:
sed ':l;N;bl'