এই প্রশ্নের মন্তব্যে এমন একটি মামলা উপস্থিত হয়েছিল যেখানে বিভিন্ন সেড বাস্তবায়ন মোটামুটি সহজ প্রোগ্রামের সাথে দ্বিমত পোষণ করেছিল এবং আমরা (বা কমপক্ষে আমি) নির্দিষ্টকরণের জন্য এটি কী প্রয়োজন তা নির্ধারণ করতে সক্ষম হয়েছি।
ইস্যুটি মুছে ফেলা লাইনে শুরু হওয়া একটি ব্যাপ্তির আচরণ:
1d;1,2d
এই আদেশটি পৌঁছানোর আগে সীমাটির শুরু সরিয়ে নেওয়া সত্ত্বেও লাইন 2 কি মুছে ফেলা উচিত? আমার প্রাথমিক প্রত্যাশা বিএসডি সেডের সাথে সঙ্গতিপূর্ণ "না" ছিল, যখন জিএনইউ সেড "হ্যাঁ" বলেছেন, এবং স্পেসিফিকেশন পাঠ্যটি পরীক্ষা করা পুরোপুরি সমাধান করে না।
আমার প্রত্যাশাটির সাথে মিলে যাওয়া (কমপক্ষে) ম্যাকওএস এবং সোলারিস sed
এবং বিএসডি sed
। অসম্মতিজনক (কমপক্ষে) জিএনইউ এবং ব্যস্তবক্স sed
এবং এখানে অসংখ্য লোক। প্রথম দুটি হ'ল এসইএস-প্রত্যয়িত এবং অন্যরা সম্ভবত আরও বিস্তৃত। কোন আচরণটি সঠিক?
স্পেসিফিকেশন টেক্সট দুই ঠিকানা ব্যাপ্তির জন্য বলেছেন:
Sed ইউটিলিটি তারপর, সব কমান্ড যার ঠিকানাগুলি নির্বাচন যে প্যাটার্ন স্থান ক্রমানুসারে প্রযোজ্য হইবে না হওয়া পর্যন্ত কমান্ড পরবর্তী চক্র বা দেনা-পাত্তনা মিটান শুরু হয়।
এবং
দুটি ঠিকানা সহ একটি সম্পাদনা কমান্ড প্রথম প্যাটার্ন স্পেস থেকে অন্তর্ভুক্ত ব্যাপ্তিকে নির্বাচন করবে যা দ্বিতীয় ঠিকানার সাথে মিলিত পরবর্তী প্যাটার্ন স্পেসের মাধ্যমে প্রথম ঠিকানার সাথে মিলবে। [...] নির্বাচিত ব্যাপ্তির পরে প্রথম লাইনটি শুরু করে সেড প্রথম ঠিকানাটির জন্য আবার সন্ধান করবে। এরপরে, প্রক্রিয়াটি পুনরাবৃত্তি করা হবে।
তর্কসাপেক্ষ, লাইন 2 হয় মধ্যে , কিনা শুরুর বিন্দু মুছে ফেলা হয়েছে নির্বিশেষে "প্রথম প্যাটার্ন স্থান আগামী প্যাটার্ন স্থান দ্বিতীয় সাথে মেলায় মাধ্যমে প্রথম ঠিকানার সাথে মেলায় থেকে সমেত পরিসর"। অন্যদিকে, আমি প্রত্যাশা করেছি যে প্রথমটি d
পরবর্তী চক্রের দিকে এগিয়ে যাবে এবং পরিসীমাটি আরম্ভ করার সুযোগ দেবে না। ইউনিক্স-নির্ধারিত বাস্তবায়নগুলি আমার প্রত্যাশা মতো করে, তবে স্পেসিফিকেশন আদেশটি সম্ভবত তা নয়।
কিছু উদাহরণস্বরূপ পরীক্ষাগুলি অনুসরণ করে তবে মূল প্রশ্নটি হ'ল: মুছে ফেলা লাইনে যখন একটি পরিসীমা শুরু হয় তখন কী করা উচিত sed
?
পরীক্ষা এবং উদাহরণ
ইস্যুটির সরলীকৃত প্রদর্শন এটি হ'ল যা লাইনগুলি মুছার পরিবর্তে অতিরিক্ত অনুলিপিগুলি মুদ্রণ করে:
printf 'a\nb\n' | sed -e '1d;1,2p'
এটি sed
ইনপুট দুটি লাইন সরবরাহ করে, a
এবং b
। প্রোগ্রামটি দুটি কাজ করে:
এর সাথে প্রথম লাইনটি মুছে ফেলে
1d
।d
কমান্ড হবেপ্যাটার্ন স্পেস মুছুন এবং পরবর্তী চক্রটি শুরু করুন। এবং
- 1 থেকে 2 পর্যন্ত রেখার ব্যাপ্তি নির্বাচন করুন এবং প্রতিটি লাইন স্বয়ংক্রিয়ভাবে প্রিন্টিংয়ের সাথে স্বতন্ত্রভাবে মুদ্রণ করে। সীমার অন্তর্ভুক্ত একটি লাইন এভাবে দু'বার প্রদর্শিত হবে।
আমার প্রত্যাশা ছিল এটি মুদ্রিত করা উচিত
b
কেবলমাত্র, সীমাটি প্রয়োগ না করায় কারণ 1,2
1 লাইন চলাকালীন কখনই পৌঁছায় না (কারণ d
পরবর্তী চক্র / লাইনে ইতিমধ্যে ঝাঁপিয়ে a
পড়েছে ) এবং তাই পরিসীমা অন্তর্ভুক্তি কখনই শুরু হয় না, যখন মুছে ফেলা হয়েছে। sed
ম্যাকোস এবং সোলারিস 10 এর কনফরমেন্ট ইউনিক্স এই আউটপুটটি উত্পাদন করে, যেমন sed
সোলারিস এবং বিএসডি sed
সাধারণভাবে নন-পসিক্স করে ।
অন্যদিকে জিএনইউ শেড প্রিন্ট করে
b
b
যা নির্দেশ করে এটা করেছে পরিসীমা বুঝিয়ে দিলেন। এটি পসিক্স মোডে এবং না উভয়ই ঘটে। বুসিবক্সের শেডের একই আচরণ রয়েছে (তবে সর্বদা অভিন্ন আচরণ নয়, তাই এটি ভাগ করা কোডের ফলাফল বলে মনে হয় না)।
সঙ্গে আরও পরীক্ষা
printf 'a\nb\nc\nd\ne\n' | sed -e '2d;2,/c/p'
printf 'a\nb\nc\nd\ne\n' | sed -e '2d;2,/d/p'
এটি নীচের লাইনে শুরু হলেও এটি মুছে ফেলা লাইনে শুরু হওয়া একটি ব্যাপ্তির সাথে আচরণ করে বলে মনে হচ্ছে । এটি দৃশ্যমান কারণ /c/
পরিসীমা শেষ করতে মেলে না। /b/
ব্যাপ্তি শুরু করতে ব্যবহার করা একই রকম আচরণ করে না2
।
প্রাথমিক কাজের উদাহরণটি আমি ব্যবহার করছিলাম
printf '%s\n' a b c d e | sed -e '1{/a/d;};1,//d'
প্রথম /a/
ম্যাচ পর্যন্ত সমস্ত লাইন মুছে ফেলার উপায় হিসাবে , এটি প্রথম লাইনে থাকলেও (জিএনইউ সিড কী ব্যবহার করবে 0,/a/d
- এটি এটির একটি চেষ্টা করা পসিক্স-সামঞ্জস্যপূর্ণ উপস্থাপনা ছিল)।
এটি প্রস্তাবিত হয়েছে যে এটির পরিবর্তে প্রথম লাইনটি মিললে (বা পুরো ফাইলটি যদি দ্বিতীয় ম্যাচ না থাকে তবে) এর দ্বিতীয় ম্যাচ পর্যন্ত মুছে ফেলা উচিত /a/
, যা প্রশংসনীয় বলে মনে হয় - তবে আবার, কেবল জিএনইউ সেড তা করে। ম্যাকোস সেড এবং সোলারিসের দু'টিই উত্পাদন করে
b
c
d
e
তার জন্য, যেমনটি আমি প্রত্যাশা করেছিলাম (জিএনইউ সেড নির্বিঘ্নিত পরিসীমা অপসারণ থেকে খালি আউটপুট উত্পাদন করে; ব্যস্তবক্সে সেড প্রিন্ট করে d
এবং e
যা স্পষ্টতই ভুল তা নির্ধারণ করুন)। সাধারণত আমি ধরে নিই যে তারা শংসাপত্রের কনফরমেশন টেস্টগুলি পাস করার অর্থ তাদের আচরণটি সঠিক, তবে পর্যাপ্ত লোকেরা অন্যথায় পরামর্শ দিয়েছেন যে আমি নিশ্চিত নই, স্পেসিফিকেশন পাঠ্যটি পুরোপুরি বিশ্বাসযোগ্য নয়, এবং পরীক্ষার স্যুট হতে পারে না পুরোপুরি ব্যাপক।
স্পষ্টতই অসম্পূর্ণতার কারণে আজ সেই কোডটি লেখার জন্য ব্যবহারিকভাবে বহনযোগ্য নয়, তবে তাত্ত্বিকভাবে এটি একটি অর্থ বা অন্য অর্থ সহ সর্বত্র সমতুল্য হওয়া উচিত। আমি মনে করি এটি একটি বাগ, তবে কোন প্রয়োগ (গুলি) এর বিরুদ্ধে এটি প্রতিবেদন করবে তা আমি জানি না। আমার মতামতটি বর্তমানে জিএনইউ এবং ব্যাসিবক্সের সেডের আচরণের সাথে সম্পর্কিত নয় তবে এটি আমার ভুল হতে পারে।
পসিক্স এখানে কি প্রয়োজন?
ed
বাইপাসsed
করে পসিক্স দিয়ে এটি প্রক্রিয়া করুন ?