Además de usar un archivo temporal para ayudar, ¿hay alguna forma en que el programa pueda almacenar la entrada de la memoria intermedia stdin
pero no la envíe hasta que obtenga el contenido EOF
? Tampoco quiero usar una variable de shell (por ejemplo buffer=$(cat)
).
Este programa debe comportarse de la siguiente manera (suponga que el nombre del programa es buffered-cat
):
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
Ahora que recibió el programa ^D
, buffered-cat
el contenido sale
line 1
line 2
line 3
sort
para este propósito. Obviamente tiene efectos secundarios que pueden ser indeseables.Respuestas:
El pobre
sponge
usaawk
:Si es así
tac
, también puedes usarlo mal:fuente
tac
Es simple y elegante, creo.| tac | tac
es simple, pero tenga en cuenta que es muy ineficiente para la tarea y sufrirá un impacto en el rendimiento, especialmente para archivos más grandes.Puede hacerlo con
sponge
moreutils .sponge
"absorberá la entrada estándar y escribirá en un archivo". Sin argumentos, ese archivo es salida estándar. La entrada dada a este comando se almacena en la memoria hasta EOF, y luego se escribe de una vez.Para escribir en un archivo normal, solo puede dar el nombre de archivo:
El propósito principal de
sponge
es permitir leer y escribir desde el mismo archivo dentro de una tubería, pero también hace lo que quiere.fuente
Siempre que su entrada sea texto ASCII (no contiene NUL 0x0 bytes hasta el final), entonces
sed -z
hace lo que desea:Las
-z
causassed
para tratar el byte NUL como un delimitador de línea en lugar de la nueva línea habitual. Entonces, siempre que su entrada sea texto normal sin bytes NUL, entonces sed continuará leyendo toda la entrada en su búfer de patrón hasta que se alcance EOF.sed
luego no procesa en el búfer y lo genera.Si hay bytes NUL en su entrada, puede hacer esto en su lugar:
fuente
Esta
sed
solución es un poco más larga que la de DigitalTrauma, pero también funciona con bytes NUL.fuente
sed ':l;N;bl'
debería funcionar también.El comportamiento que está solicitando, ¿no es el comportamiento predeterminado de un gato simple?
fuente
cat
(Enter)Line 1
(Enter) y vea qué sucede.La misma idea que el ejemplo awk de muru, excepto en Python. Use CtrlDpara dejar de leer en líneas
fuente
perl -e 'print <>'
(!)