যখন ইনপুট ফাইলটি সন্ধানযোগ্য (নিয়মিত ফাইল থেকে পড়ার মতো) বা অন-সন্ধানযোগ্য (পাইপ থেকে পড়ার মতো), sed
(এবং অন্যান্য স্ট্যান্ডার্ড ইউটিলিটিস) আলাদাভাবে আচরণ করবে ( এই লিঙ্কটিরINPUT FILES
বিভাগটি পড়ুন )।
দস্তাবেজের উদ্ধৃতি:
যখন কোনও স্ট্যান্ডার্ড ইউটিলিটি একটি সন্ধানযোগ্য ইনপুট ফাইলটি পড়ে এবং ফাইলের শেষের দিকে পৌঁছানোর আগে কোনও ত্রুটি ছাড়াই শেষ হয়, ইউটিলিটি নিশ্চিত করবে যে ওপেন ফাইলের বিবরণে ফাইলটি অফসেটটি যথাযথভাবে ইউটিলিটি দ্বারা প্রসেস করা শেষ বাইটের ঠিক পরে রয়েছে।
সুতরাং:
(sed '/y/ q'; echo aaa; cat) < test
sed
q
ইওএফ পৌঁছানোর আগে ইউআইটি কমান্ড সম্পাদন করেছে , সুতরাং এটি zzz
লাইনের শুরুতে ফাইলটি অফসেট ছেড়ে দিয়েছে , তাই cat
অবশিষ্ট রেখাগুলি মুদ্রণ চালিয়ে যেতে পারে (জিএনইউ সেড কোনও অবস্থাতেই পসিক্স অনুগত নয়, নীচে দেখুন)।
এবং ডক থেকে অবিরত:
যে ফাইলগুলি অন্বেষণযোগ্য নয় তাদের ক্ষেত্রে সেই ফাইলের জন্য ওপেন ফাইলের বিবরণে অফসেট হওয়া ফাইলের অবস্থা নির্ধারিত
এই ক্ষেত্রে, আচরণটি অনির্ধারিত। সর্বাধিক মানক সরঞ্জামগুলি অন্তর্ভুক্ত sed
যথাসম্ভব ইনপুট গ্রহণ করবে। এটি পড়তে হবে yyy
লাইনটি পাস করুন , এবং q
ফাইলটি অফসেটটি পুনরুদ্ধার না করেই uit করা হবে, তাই কিছুই বাদ যায় না cat
।
জিএনইউ sed
মানের সাথে সামঞ্জস্যপূর্ণ নয়, এটি সিস্টেমের স্টিডিও বাস্তবায়ন এবং গ্লিবসি সংস্করণের উপর নির্ভর করে:
$ (gsed '/y/ q'; echo aaa; cat) < test
xxx
yyy
aaa
এখানে, ফলাফলটি ম্যাক ওএসএক্স 10.11.6, ভার্চুয়াল মেশিনস সেন্টোস 7.2 - গ্লিবসি 2.17, উবুন্টু 14.04 - গ্লিবসি 2.19 থেকে পাওয়া গেছে, যা সিইপিএইচ ব্যাকএন্ডের সাথে ওপেনস্ট্যাকে চালিত হয়।
এই সিস্টেমে, আপনি -u
স্ট্যান্ডার্ড আচরণ অর্জনের জন্য বিকল্পটি ব্যবহার করতে পারেন :
(gsed -u '/y/ q'; echo aaa; cat) </tmp/test
এবং পাইপ জন্য:
$ cat test | (gsed -u '/y/ q'; echo aaa; cat)
xxx
yyy
aaa
zzz
যা মারাত্মকভাবে অদক্ষ পারফরম্যান্সের দিকে পরিচালিত করে, কারণ sed
একবারে একটি বাইট পড়তে হয়। এর একটি আংশিক আউটপুট strace
:
$ strace -fe read sh -c '{ sed -u "/y/q"; echo aaa; cat; } <test'
...
[pid 5248] read(3, "", 4096) = 0
[pid 5248] read(0, "x", 1) = 1
[pid 5248] read(0, "x", 1) = 1
[pid 5248] read(0, "x", 1) = 1
[pid 5248] read(0, "\n", 1) = 1
xxx
[pid 5248] read(0, "y", 1) = 1
[pid 5248] read(0, "y", 1) = 1
[pid 5248] read(0, "y", 1) = 1
[pid 5248] read(0, "\n", 1) = 1
yyy
...
cat
(সাব শেলের মধ্যে) প্রথম ক্ষেত্রে ফাইল ডেস্ক্রিপ্টর পুনরায় ব্যবহার করতে পারে, কারণ স্টিডিন একটি আসল ফাইলের সাথে আবদ্ধ। দ্বিতীয় ক্ষেত্রে, স্টিডিন একটি পাইপ থেকে এবং কোনও আসল ফাইল নয়। নোট যে(sed '/y/ q'; echo aaa; cat) < <(cat test)
মুদ্রণ নাzzz
।