Abgesehen von der Verwendung einer temporären Datei als Hilfe gibt es eine Möglichkeit / ein Programm, das Eingaben puffern könnte, stdin
aber den Inhalt erst ausgibt, wenn die EOF
. Ich möchte auch keine Shell-Variable verwenden (zB buffer=$(cat)
).
Dieses Programm sollte sich wie folgt verhalten (vorausgesetzt, der Programmname lautet buffered-cat
):
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
Nachdem das Programm empfangen wurde ^D
, buffered-cat
gibt es den Inhalt aus
line 1
line 2
line 3
sort
für diesen Zweck. Offensichtlich hat es Nebenwirkungen, die unerwünscht sein können.Antworten:
Ein armer Mann
sponge
benutztawk
:Wenn
tac
ja, können Sie es auch missbrauchen:quelle
tac
ist einfach und elegant, denke ich.| tac | tac
ist einfach, aber denken Sie daran, dass es für die Aufgabe sehr ineffizient ist und Sie einen Leistungseinbruch erleiden, insbesondere bei größeren Dateien.Sie können dies mit
sponge
moreutils tun .sponge
wird "Standardeingabe aufsaugen und in eine Datei schreiben". Ohne Argumente ist diese Datei die Standardausgabe. Die Eingabe für diesen Befehl wird bis EOF gespeichert und dann auf einmal ausgeschrieben.Zum Schreiben in eine normale Datei können Sie einfach den Dateinamen angeben:
Der Hauptzweck von
sponge
besteht darin, das Lesen und Schreiben aus derselben Datei innerhalb einer Pipeline zu ermöglichen, aber es macht auch das, was Sie wollen.quelle
Solange Ihre Eingabe ASCII-Text ist (enthält bis zum Ende keine NUL 0x0-Bytes), tun
sed -z
Sie, was Sie wollen:Die
-z
Ursachensed
für die Behandlung des NUL-Bytes als Zeilenbegrenzer anstelle der üblichen neuen Zeile. Solange Ihre Eingabe regulärer Text ohne NUL-Bytes ist, liest sed die gesamte Eingabe weiter in ihren Musterpuffer, bis EOF erreicht ist.sed
führt dann keine Verarbeitung des Puffers durch und gibt ihn aus.Wenn Ihre Eingabe NUL-Bytes enthält, können Sie stattdessen Folgendes tun:
quelle
Diese
sed
Lösung ist etwas länger als die von DigitalTrauma, funktioniert aber auch mit NUL-Bytes.quelle
sed ':l;N;bl'
sollte auch funktionieren.Das Verhalten, nach dem Sie fragen, ist es nicht das Standardverhalten einer einfachen Katze?
quelle
cat
Geben Sie (Enter)Line 1
(Enter) ein und sehen Sie, was passiert.Gleiche Idee wie Murus awk-Beispiel, außer in Python. Verwenden Sie CtrlDdiese Option , um das Lesen von Zeilen zu beenden
quelle
perl -e 'print <>'
(!)