Sed (Stream Editor) একটি শক্তিশালী টুল যা শুধুমাত্র টেক্সট পরিবর্তন বা ম্যানিপুলেশন করতে সাহায্য করে না, বরং এর মাধ্যমে লজিকাল ফ্লো কন্ট্রোল (logical flow control) ব্যবহার করে আপনি সুনির্দিষ্ট পরিস্থিতিতে নির্দিষ্ট কাজ করতে পারেন। লজিকাল ফ্লো কন্ট্রোল ব্যবহারের মাধ্যমে আপনি if-else কন্ডিশন, লুপ এবং জাম্প স্টেটমেন্টের মতো কার্যকরী ফ্লো কন্ট্রোল ব্যবহার করতে পারেন।
Sed-এ লজিকাল ফ্লো কন্ট্রোল করার জন্য প্রধানত if-else, while, next ইত্যাদি কনসেপ্ট ব্যবহৃত হয়, যদিও Sed মূলত স্ক্রিপ্টিং ভাষা নয় এবং এর মধ্যে জটিল ফ্লো কন্ট্রোল সরাসরি পাওয়া যায় না। তবে, কিছু কমান্ড এবং টেকনিক ব্যবহার করে আপনি এসব কার্যকারিতা আংশিকভাবে অর্জন করতে পারেন।
Sed-এ লজিকাল ফ্লো কন্ট্রোলের প্রধান উপাদান
b(branch) কমান্ডt(test) কমান্ডn(next) কমান্ডp(print) কমান্ড
1. b (branch) কমান্ড: Condition-based Jump
b কমান্ডটি Sed-এ যেকোনো অবস্থায় লজিক্যাল জাম্প করার জন্য ব্যবহৃত হয়। এটি নির্দিষ্ট লাইন বা প্যাটার্নের পরবর্তী কমান্ডকে অগ্রাহ্য করে চলে যেতে সহায়তা করে।
সিনট্যাক্স:
sed '/pattern/b label' file.txtএখানে:
/pattern/: যে প্যাটার্নটি মিললে Sed জাম্প করবে।b label: এটি যেকোনো অবস্থায় label এর দিকে চলে যাবে, যেখানে আপনি পরবর্তী কমান্ড সংরক্ষণ করেছেন।
উদাহরণ:
ধরা যাক, আপনি যদি "error" শব্দ পাওয়া গেলে কমান্ডের পরবর্তী অংশ উপেক্ষা করতে চান, তবে:
sed '/error/b skip; s/cat/dog/' file.txtএখানে:
- যদি "error" পাওয়া যায়, তাহলে
b skipএর মাধ্যমে এটি "skip" লেবেলে চলে যাবে এবং "s/cat/dog/" কমান্ডটি কার্যকর হবে না। - "skip" লেবেলে কিছু কাজ করলে, "cat" শব্দটি "dog"-এ প্রতিস্থাপন হবে।
2. t (test) কমান্ড: Test and Branching
t কমান্ডটি if-else লজিকের মতো কাজ করে। এটি একটি শর্ত পরীক্ষা করে এবং যদি পূর্ববর্তী পরিবর্তন সফল হয়, তাহলে নির্দিষ্ট লেবেলে জাম্প করে।
সিনট্যাক্স:
sed '/pattern/t label' file.txtএখানে:
/pattern/: যদি প্যাটার্ন পাওয়া যায়, তাহলে এটি শর্তের সাথে মিলবে।t label: এটিtকমান্ডটি ব্যবহার করে, পরিবর্তন সফল হলে নির্দিষ্ট লেবেলে জাম্প করবে।
উদাহরণ:
ধরা যাক, আপনি যদি "cat" শব্দটি পেলে তা "dog"-এ প্রতিস্থাপন করতে চান, এবং শেষে একটি বার্তা প্রদর্শন করতে চান:
sed '/cat/s/cat/dog/t end; s/dog/cat/' file.txt; echo "Pattern replaced!"এখানে:
/cat/s/cat/dog/: "cat" শব্দটি "dog"-এ পরিবর্তন করবে।t end: সফল পরিবর্তন হলে লেবেলend-এ চলে যাবে, এবং পরবর্তীs/dog/cat/কমান্ডটি কার্যকর হবে না।echo "Pattern replaced!": বার্তা দেখাবে যদি পরিবর্তন সফল হয়।
3. n (next) কমান্ড: Skip Current Line
n কমান্ডটি Sed-এ বর্তমান লাইনে কাজ করার পরে পরবর্তী লাইনে চলে যেতে ব্যবহৃত হয়। এটি আপনাকে টেক্সট প্রক্রিয়া করার সময় কেবলমাত্র নির্দিষ্ট কিছু লাইনকে এড়িয়ে যাওয়ার সুযোগ দেয়।
সিনট্যাক্স:
sed 'n' file.txtউদাহরণ:
sed '1n; s/cat/dog/' file.txtএটি:
- প্রথম লাইনটি এড়িয়ে যাবে এবং পরবর্তী লাইনগুলোতে "cat" শব্দটিকে "dog" দিয়ে প্রতিস্থাপন করবে।
4. p (print) কমান্ড: Print Matched Lines
p কমান্ডটি যেকোনো প্যাটার্নের সাথে মিল পাওয়া লাইনগুলো প্রিন্ট করতে ব্যবহৃত হয়। আপনি যখন ম্যানিপুলেশন বা টেক্সট চেক করতে চান, তখন এটি ব্যবহার করতে পারেন।
সিনট্যাক্স:
sed -n '/pattern/p' file.txtউদাহরণ:
sed -n '/error/p' file.txtএটি:
-nঅপশনটি ব্যবহার করে শুধুমাত্র "error" শব্দ যুক্ত লাইনগুলো প্রিন্ট করবে।
যেমন লজিকাল ফ্লো কন্ট্রোলের বাস্তব উদাহরণ
ফ্লো কন্ট্রোল উদাহরণ 1: Conditional Check and Jump
ধরা যাক, আপনি একটি ফাইলে "cat" শব্দ পাওয়া গেলে কিছু না করে, অন্য কিছু শব্দের সাথে কাজ করতে চান:
sed '/cat/b skip; s/dog/cat/; :skip' file.txtএখানে:
- যখন "cat" পাওয়া যাবে, তখন
b skipকমান্ডটি skip লেবেলে চলে যাবে এবং "dog" শব্দ পরিবর্তন হবে না। - যদি "cat" না পাওয়া যায়, তবে সাধারণভাবে "dog" শব্দের পরিবর্তে "cat" বসানো হবে।
ফ্লো কন্ট্রোল উদাহরণ 2: Using Test Command
sed '/cat/t found; s/dog/cat/; :found' file.txtএখানে:
- যদি "cat" পাওয়া যায়, তবে
t foundলেবেলে চলে যাবে এবং পরবর্তী "dog" প্রতিস্থাপন হবে না। - যদি "cat" না পাওয়া যায়, তবে "dog" শব্দটি "cat" দিয়ে পরিবর্তিত হবে।
Conclusion
Sed-এ লজিকাল ফ্লো কন্ট্রোল ব্যবহার করে আপনি টেক্সট ফাইলের মধ্যে conditional branching, looping, skipping, এবং matching করতে পারেন। b, t, n, এবং p কমান্ডগুলো ব্যবহার করে আপনি যদি নির্দিষ্ট প্যাটার্ন মেলে কিছু কার্যকরী কাজ করতে চান, তবে এই কমান্ডগুলি অত্যন্ত সহায়ক। Sed এই ধরনের ফ্লো কন্ট্রোল ব্যবহার করে complex editing এবং conditional replacement সহজেই সম্পন্ন করতে সাহায্য করে।
Read more