Oprócz korzystania z pliku tymczasowego do pomocy, czy istnieje sposób / program mógłby buforować dane wejściowe z, stdin
ale nie wysyła zawartości do momentu uzyskania EOF
. Nie chcę też używać zmiennej powłoki (np buffer=$(cat)
.).
Ten program powinien zachowywać się jak poniżej (zakładając, że nazwa programu to buffered-cat
):
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
Teraz, gdy program otrzymał ^D
, buffered-cat
wyświetla zawartość
line 1
line 2
line 3
sort
do tego celu. Oczywiście ma skutki uboczne, które mogą być niepożądane.Odpowiedzi:
Biedny człowiek
sponge
używaawk
:Jeśli tak
tac
, możesz go również niewłaściwie użyć:źródło
tac
myślę, że jest prosty i elegancki.| tac | tac
jest prosty, ale należy pamiętać, że jest on bardzo nieefektywny dla zadania, a Ty odczujesz spadek wydajności, szczególnie w przypadku większych plików.Możesz to zrobić za pomocą
sponge
moreutils .sponge
„wchłonie standardowe dane wejściowe i zapisze w pliku”. Bez argumentów plik ten jest standardowym wyjściem. Dane wejściowe podane dla tego polecenia są przechowywane w pamięci aż do EOF, a następnie zapisywane jednocześnie.Aby zapisać do normalnego pliku, możesz po prostu podać nazwę pliku:
Głównym celem
sponge
jest umożliwienie odczytu i zapisu z tego samego pliku w potoku, ale robi to, co chcesz.źródło
Tak długo, jak wpisujesz tekst ASCII (do końca nie zawiera bajtów NUL 0x0), wtedy
sed -z
robi to, co chcesz:Te
-z
przyczynysed
traktować bajt NUL jako ogranicznik linii zamiast zwykłego linią. Tak długo, jak twój tekst jest zwykłym tekstem bez bajtów NUL, wtedy sed będzie wczytywał cały tekst do bufora wzorców, aż do osiągnięcia EOF.sed
następnie nie przetwarza bufora i wysyła go.Jeśli na wejściu znajdują się bajty NUL, możesz to zrobić w zamian:
źródło
To
sed
rozwiązanie jest nieco dłuższe niż rozwiązanie DigitalTrauma, ale działa również z bajtami NUL.źródło
sed ':l;N;bl'
też powinien działać.Zachowanie, o które prosisz, czy nie jest to domyślne zachowanie zwykłego kota?
źródło
cat
(Enter)Line 1
(Enter) i zobacz, co się stanie.Taki sam pomysł jak w awk Muru, z wyjątkiem Pythona. Użyj, CtrlDaby zatrzymać czytanie w wierszach
źródło
perl -e 'print <>'
(!)