Además de usar un archivo temporal para ayudar, ¿hay alguna forma en que el programa pueda almacenar la entrada de la memoria intermedia stdinpero 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-catel contenido sale
line 1
line 2
line 3

sortpara este propósito. Obviamente tiene efectos secundarios que pueden ser indeseables.Respuestas:
El pobre
spongeusaawk:Si es así
tac, también puedes usarlo mal:fuente
tacEs simple y elegante, creo.| tac | taces 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
spongemoreutils .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
spongees 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 -zhace lo que desea:Las
-zcausassedpara 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.sedluego no procesa en el búfer y lo genera.Si hay bytes NUL en su entrada, puede hacer esto en su lugar:
fuente
Esta
sedsolució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 <>'(!)