एक प्रोग्राम जो स्टडिन या फ़ाइल को बफर कर सकता है


12

मदद करने के लिए एक अस्थायी फ़ाइल का उपयोग करने के अलावा, वहाँ एक रास्ता / कार्यक्रम से इनपुट बफर सकता है, stdinलेकिन जब तक सामग्री प्राप्त नहीं करता है EOF। मैं एक शेल चर (या तो buffer=$(cat)) का उपयोग नहीं करना चाहता ।

इस कार्यक्रम को नीचे के रूप में व्यवहार करना चाहिए (मान लें कि कार्यक्रम का नाम है buffered-cat):

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

अब जब कि कार्यक्रम प्राप्त हुआ है ^D, buffered-catसामग्री को आउटपुट करता है

line 1
line 2
line 3

मैं सामान्य रूप sortसे इस उद्देश्य के लिए उपयोग करता हूं । स्पष्ट रूप से इसके दुष्प्रभाव हैं जो अवांछनीय हो सकते हैं।
एड्रियन प्रैंक

जवाबों:


20

एक गरीब आदमी का spongeउपयोग awk:

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

यदि आपके पास है tac, तो आप इसका दुरुपयोग भी कर सकते हैं:

... | tac | tac

1
tacमुझे लगता है कि सरल और सुरुचिपूर्ण है।
एकेमे मो

6
@EkeymeMo | tac | tac है आसान है, लेकिन मन में भालू यह कार्य के लिए अत्यधिक अक्षम है और आप विशेष रूप से बड़ी फ़ाइलों के लिए एक प्रदर्शन हिट भुगतना होगा, कि।
डिजिटल ट्रामा

@DigitalTrauma हाँ, मुझे इसका दोष पता है। मैं एक फाइल का परीक्षण करता हूं जिसमें 100 हजारों लाइन होती हैं। मेरे लिए ठीक है। मैंने आपकी टिप्पणी को सत्य मानकर मतदान किया।
एकेमे मो

29

आप इसे अधिक spongeआंतों से कर सकते हैं । sponge"मानक इनपुट को सोखेंगे और एक फ़ाइल में लिखेंगे"। बिना किसी तर्क के, वह फ़ाइल मानक आउटपुट है। इस कमांड को दिए गए इनपुट को EOF तक मेमोरी में स्टोर किया जाता है, और फिर सभी को एक बार में लिखा जाता है।

एक सामान्य फ़ाइल में लिखने के लिए, आप केवल फ़ाइल नाम दे सकते हैं:

cmd | sponge filename

इसका मुख्य उद्देश्य spongeपाइपलाइन के भीतर एक ही फ़ाइल से पढ़ने और लिखने की अनुमति देना है, लेकिन यह वही करता है जो आप चाहते हैं।


6

जब तक आपका इनपुट ASCII टेक्स्ट है (अंत तक कोई NUL 0x0 बाइट्स नहीं है), तब sed -zआपको वही चाहिए जो आप चाहते हैं:

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

-zका कारण बनता है sedएक लाइन सीमांकक के बजाय हमेशा की तरह नई पंक्ति के रूप में NUL बाइट के इलाज के लिए। इसलिए जब तक आपका इनपुट नियमित रूप से बिना एनयूएल बाइट्स के साथ नियमित पाठ है, तब तक ईओडी तक पहुंचने तक सेड पूरे इनपुट को अपने पैटर्न बफर में पढ़ना जारी रखेगा। sedफिर बफर पर कोई प्रसंस्करण नहीं करता है और इसे आउटपुट करता है।


यदि आपके इनपुट में NUL बाइट्स मौजूद हैं, तो आप इसके बजाय ऐसा कर सकते हैं:

sed ':l;N;bl'

4

यह sedसमाधान DigitalTrauma की तुलना में थोड़ा लंबा है, लेकिन NUL बाइट्स के साथ भी काम करता है।

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

2
sed ':l;N;bl'काम भी करना चाहिए।
डिजिटल ट्रामा

1

जिस व्यवहार के लिए आप पूछ रहे हैं, क्या वह साधारण बिल्ली का डिफ़ॉल्ट व्यवहार नहीं है?

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
नहीं, यह यहाँ दस्तावेजों का व्यवहार है। टाइप करने की कोशिश करें cat(दर्ज करें) Line 1(दर्ज करें) और देखें कि क्या होता है।
जी-मैन ने कहा कि 'मोनिका'

हां, यह यहाँ-डॉक्टर संरचना है। ओपी क्या चाहता है, सरल और बहुत करीब हो जाता है। या तो स्थापना की आवश्यकता नहीं है
कोलोडियाज़नी

1

पाइथन को छोड़कर मूरू के जागृत उदाहरण के रूप में एक ही विचार। CtrlDलाइनों में पढ़ने को रोकने के लिए उपयोग करें

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

3
या perl -e 'print <>'(!)
dave_thompson_085
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.