Stdin veya dosyayı arabelleğe alabilen bir program


12

Yardımcı olmak için geçici bir dosya kullanmanın yanı sıra, programın girdiden arabelleğe alınabileceği stdinancak içeriği alana kadar çıktı veremediği bir yol var mı EOF? Ben de bir kabuk değişkeni kullanmak istemiyorum (örneğin buffer=$(cat)).

Bu program aşağıdaki gibi davranmalıdır (program adının geçerli olduğunu varsayalım buffered-cat):

$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)

Program şimdi alındığı için ^D, buffered-catçıktılar

line 1
line 2
line 3

Normalde sortbu amaç için kullanıyorum . Açıkçası istenmeyen yan etkileri vardır.
Adrian Pronk

Yanıtlar:


20

Fakir bir adam spongekullanıyor awk:

awk '{a[NR] = $0} END {for (i = 1; i <= NR; i++) print a[i]}'

Varsa tac, onu da kötüye kullanabilirsiniz:

... | tac | tac

1
tacbasit ve zarif, sanırım.
Ekeyme Mo

6
@EkeymeMo | tac | tac olan basit ama unutmayın ki bu görev için son derece verimsiz olduğunu ve özellikle büyük dosyalar için bir performans isabet acı edeceğiz.
Dijital Travma

@DigitalTrauma evet, bunun dezavantajını biliyorum. 100 bin satırlı bir dosyayı test ediyorum. Benim için uygun. Yorumunuzu doğru olduğu için oyladım.
Ekeyme Mo

29

Bunu spongemoreutils ile yapabilirsiniz . sponge"standart girdiyi emer ve bir dosyaya yazar". Bağımsız değişken olmadan, bu dosya standart çıktıdır. Bu komuta verilen giriş EOF'a kadar hafızada saklanır ve bir kerede yazılır.

Normal bir dosyaya yazmak için sadece dosya adını verebilirsiniz:

cmd | sponge filename

Temel amacı, spongebir boru hattı içinde aynı dosyadan okuma ve yazmaya izin vermektir, ancak istediğinizi de yapar.


6

Girişiniz ASCII metni olduğu sürece (sonuna kadar NUL 0x0 bayt sed -ziçermiyorsa ), istediğinizi yapın:

$ sed -z ''
Line 1
Line 2
Line 3
^D
Line 1
Line 2
Line 3
$ 

-zNedenleri sedbir çizgi sınırlayıcı yerine zamanki yeni satır olarak boş karakter tedavisi için. Girişiniz NUL bayt içermeyen normal metin olduğu sürece sed, EOF'a ulaşılana kadar tüm girdiyi desen arabelleğine okumaya devam eder. seddaha sonra arabellek üzerinde işlem yapmaz ve çıktısını verir.


Girişinizde NUL bayt varsa, bunun yerine bunu yapabilirsiniz:

sed ':l;N;bl'

4

Bu sedçözüm DigitalTrauma'nınkinden biraz daha uzundur, ancak NUL baytlarıyla da çalışır.

sed -n 'H;${x;s/^\n//;p}'

2
sed ':l;N;bl'çalışmalı.
Dijital Travma

1

İstediğiniz davranış, basit kedinin varsayılan davranışı değil mi?

gv@debian:$ cat << EOF #or cat <<EOF >file or cat <<EOF >/dev/stdout
> Line 1
> Line 2
> Line 3
> EOF
Line 1
Line 2
Line 3
gv@debian:$

3
Hayır, buradaki belgelerin davranışı bu. cat(Enter) Line 1(Enter) yazmayı deneyin ve ne olduğunu görün.
G-Man

Evet, bu belge dokümanı. Basit ve OP'nin istediklerine oldukça yaklaşıyor. Kurulum gerektirmez
Sergiy Kolodyazhnyy

1

Muru'nun awk örneğiyle aynı fikir, Python hariç. CtrlDSatırlardaki okumayı durdurmak için kullanın

$ python -c 'import sys;print("".join(sys.stdin.readlines()))'                                                           
line1
line2
line3 # press Enter and Ctrl+D at this point
line1
line2
line3

3
Veya perl -e 'print <>'(!)
dave_thompson_085
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.