Mis à part l'utilisation d'un fichier temporaire pour aider, y a-t-il un moyen / programme pourrait tamponner l'entrée à partir de stdin
mais ne sort pas le contenu jusqu'à ce qu'il obtienne le EOF
. Je ne veux pas non plus utiliser de variable shell (par exemple buffer=$(cat)
).
Ce programme doit se comporter comme ci-dessous (en supposant que le nom du programme est buffered-cat
):
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
Maintenant que le programme a été reçu ^D
, buffered-cat
le contenu sort
line 1
line 2
line 3
sort
à cet effet. De toute évidence, il a des effets secondaires qui peuvent être indésirables.Réponses:
Un pauvre
sponge
utiliseawk
:Si c'est le cas
tac
, vous pouvez également en abuser:la source
tac
est simple et élégant, je pense.| tac | tac
est simple, mais gardez à l'esprit qu'il est très inefficace pour la tâche et vous souffrirez d'un impact sur les performances, en particulier pour les fichiers plus volumineux.Vous pouvez le faire avec
sponge
moreutils .sponge
"absorbera l'entrée standard et écrit dans un fichier". Sans argument, ce fichier est une sortie standard. L'entrée donnée à cette commande est stockée en mémoire jusqu'à EOF, puis écrite en une seule fois.Pour écrire dans un fichier normal, vous pouvez simplement donner le nom du fichier:
Le but principal de
sponge
est de permettre la lecture et l'écriture à partir du même fichier dans un pipeline, mais il fait aussi ce que vous voulez.la source
Tant que votre entrée est du texte ASCII (ne contient aucun octet NUL 0x0 jusqu'à la fin),
sed -z
fait ce que vous voulez:Les
-z
causessed
de traiter l'octet NUL comme un délimiteur de ligne au lieu de la nouvelle ligne habituelle. Donc, tant que votre entrée est du texte normal sans octets NUL, sed continuera de lire l'intégralité de l'entrée dans son tampon de modèle jusqu'à ce que EOF soit atteint.sed
ne fait alors aucun traitement sur le tampon et le sort.Si des octets NUL sont présents dans votre entrée, vous pouvez le faire à la place:
la source
Cette
sed
solution est un peu plus longue que celle de DigitalTrauma, mais fonctionne également avec des octets NUL.la source
sed ':l;N;bl'
devrait aussi fonctionner.Le comportement que vous demandez, n'est-ce pas le comportement par défaut d'un simple chat?
la source
cat
(Entrée)Line 1
(Entrée) et voyez ce qui se passe.Même idée que l'exemple awk de muru, sauf en Python. Utilisez CtrlDpour arrêter la lecture des lignes
la source
perl -e 'print <>'
(!)