এমন একটি প্রোগ্রাম যা স্টিডিন বা ফাইল বাফার করতে পারে


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
@ একেমেমো সহজ, তবে মনে রাখবেন যে এটি কার্যটির | tac | tac পক্ষে অত্যন্ত অদক্ষ এবং আপনি বিশেষত বড় ফাইলগুলির জন্য একটি পারফরম্যান্সের আঘাতের শিকার হবেন।
ডিজিটাল ট্রমা

@ ডিজিটালট্রামা হ্যাঁ, আমি এর অপূর্ণতা জানি। আমি ১০০ হাজার লাইনের সাথে এমন একটি ফাইল পরীক্ষা করি। এইটা আমার জন্য ঠিক. আপনার মতামতটি সত্য বলে আমি ভোট দিয়েছি।
একিমে মো

29

আপনি spongeMoreutils থেকে এটি করতে পারেন । sponge"স্ট্যান্ডার্ড ইনপুট ভিজিয়ে একটি ফাইলে লিখবে"। কোনও যুক্তি ছাড়াই, ফাইলটি স্ট্যান্ডার্ড আউটপুট। এই কমান্ডটিতে প্রদত্ত ইনপুটটি ইওএফ অবধি স্মৃতিতে সংরক্ষণ করা হবে এবং তারপরে সমস্ত একবারে লেখা হবে।

একটি সাধারণ ফাইলে লেখার জন্য আপনি কেবল ফাইলের নাম দিতে পারেন:

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একটি লাইন বিভেদক পরিবর্তে চলিত সম্পর্কে newline যেমন NUL বাইট চিকিত্সা। সুতরাং যতক্ষণ না আপনার ইনপুটটি কোনও NUL বাইট না দিয়ে নিয়মিত পাঠ্য হয়, ততক্ষণ সেড পুরো ইনপুটটিকে তার প্যাটার্ন বাফারে পড়তে থাকবে যতক্ষণ না ইওএফ পৌঁছে যায়। sedতারপরে বাফারে কোনও প্রক্রিয়াজাতকরণ হয় না এবং এটি আউটপুট করে।


যদি আপনার ইনপুটটিতে NUL বাইট উপস্থিত থাকে, তবে আপনি পরিবর্তে এটি করতে পারেন:

sed ':l;N;bl'

4

এই sedসমাধানটি ডিজিটালট্রামার চেয়ে কিছুটা দীর্ঘ, তবে এটি 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.