এই আর্টিকেল চলমান Unix Sed Tips and Tricks সিরিজের অংশ।
আমাদের আগের sed আর্টিকেলগুলোতে আমরা শিখেছি — sed printing, sed deletion, sed substitute, sed file write, এবং sed multiple commands।
এই আর্টিকেলে, আসুন "s" সাবস্টিটিউট কমান্ডের সাথে কিছু আকর্ষণীয় ওয়ার্কঅরাউন্ড রিভিউ করি বেশ কিছু প্র্যাকটিক্যাল উদাহরণের সাথে।
I. Sed সাবস্টিটিউশন ডিলিমিটার
যে মত আমরা আগের পোস্টে আলোচনা করেছিলাম, আমরা sed সাবস্টিটিউট কমান্ডে ভিন্ন ডিলিমিটার যেমন @ % | ; : ব্যবহার করতে পারি।
প্রথমে path.txt ফাইল তৈরি করুন যা নিচের সব উদাহরণে ব্যবহার হবে।
$ cat path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
উদাহরণ ১ – sed @ ডিলিমিটার: /opt/omni/lbin কে /opt/tools/bin-এ সাবস্টিটিউট করুন
যখন আপনি একটি পাথ নাম সাবস্টিটিউট করবেন যাতে '/' আছে, তবে '/'র বদলে @ ডিলিমিটার হিসেবে ব্যবহার করতে পারেন। নিচের sed উদাহরণে, ইনপুট ফাইলের লাস্ট লাইনে, /opt/omni/lbin /opt/tools/bin-এ চেঞ্জ হয়েছে।
$ sed 's@/opt/omni/lbin@/opt/tools/bin@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
উদাহরণ ২ – sed / ডিলিমিটার: /opt/omni/lbin কে /opt/tools/bin-এ সাবস্টিটিউট করুন
পাথ নাম রিলেটেড সাবস্টিটিউশনে '/' ব্যবহার করলে, আপনাকে সাবস্টিটিউশন ডেটাতে '/' ইস্কেপ করতে হবে নিচে দেখানো পদ্ধতিতে। এই sed উদাহরণে, ডিলিমিটার '/' REGEXP এবং REPLACEMENT অংশে ইস্কেপ করা হয়েছে।
$ sed 's/\/opt\/omni\/lbin/\/opt\/tools\/bin/g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
II. Sed ‘&’ ম্যাচ করা স্ট্রিং পান
একটি ইনপুট লাইনের সুনির্দিষ্ট অংশ যেই রেগুলার এক্সপ্রেশন ম্যাচ করে, সেটি & দ্বারা রিপ্রেজেন্ট করা হয়, যা রিপ্লেসমেন্ট পার্টে ব্যবহার করা যায়।
উদাহরণ ১ – sed & ব্যবহার: /usr/bin/ কে /usr/bin/local-এ সাবস্টিটিউট করুন
$ sed 's@/usr/bin@&/local@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin/local:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin/local:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
উপরের উদাহরণে রিপ্লেসমেন্ট পার্টে '&' ম্যাচ করা প্যাটার্ন /usr/bin-কে রিপ্লেস করবে এবং /local যোগ করবে। তাই আউটপুটে /usr/bin-এর সব অকারেন্স /usr/bin/local-এ রিপ্লেস হবে।
উদাহরণ ২ – sed & ব্যবহার: পুরো লাইন ম্যাচ করুন
& দিয়ে দिये गये REGEXP-এর সাথে যা ম্যাচ করে সেটি রিপ্লেস হয়।
$ sed 's@^.*$@<<<&>>>@g' path.txt <<</usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin>>> <<</usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:>>> <<</opt/omni/lbin:/opt/omni/sbin:/root/bin>>>
উপরের উদাহরণে regexp-এ "^.*$" আছে যা পুরো লাইন ম্যাচ করে। রিপ্লেসমেন্ট পার্ট <<<&>>> পুরো লাইন লিখে <<< এবং >>> লাইনের শুরু এবং শেষে যথাক্রমে।
III. Sed-এ গ্রুপিং এবং ব্যাক-রেফারেন্স
গ্রুপিং sed-এ নরমাল রেগুলার এক্সপ্রেশনের মত ব্যবহার করা যায়। একটি গ্রুপ "\( " দিয়ে ওপেন হয় এবং "\)" দিয়ে ক্লোজ হয়। গ্রুপিং ব্যাক-রেফারেন্সিংয়ের সাথে কম্বাইন করে ব্যবহার করা যায়।
ব্যাক-রেফারেন্স হলো গ্রুপিং দিয়ে সিলেক্ট করা একটি রেগুলার এক্সপ্রেশন পার্টের পুনরাবৃত্তি ব্যবহার। Sed-এ ব্যাক-রেফারেন্স রেগুলার এক্সপ্রেশন এবং সাবস্টিটিউট কমান্ডের রিপ্লেসমেন্ট পার্ট দুটোইয়ে ব্যবহার করা যায়।
উদাহরণ ১: প্রতিটি লাইনের শুধু প্রথম পাথ পান
$ sed 's/\(\/[^:]*\).*/\1/g' path.txt /usr/kbos/bin /usr/local/sbin /opt/omni/lbin
উপরের উদাহরণে, \(\/[^:]*\) প্রথম : আসার আগের পাথ ম্যাচ করে। \1 প্রথম ম্যাচ করা গ্রুপ রিপ্লেস করে।
উদাহরণ ২: মাল্টিগ্রুপিং
path.txt ফাইলের লাস্ট লাইনের ফিল্ডের অর্ডার পরিবর্তন করুন।
$ sed '$s@\([^:]*\):\([^:]*\):\([^:]*\)@\3:\2:\1@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/omni/bin: /root/bin:/opt/omni/sbin:/opt/omni/lbin
উপরের কমান্ডে $ স্পেসিফাই করে যে সাবস্টিটিউশন শুধু লাস্ট লাইনের জন্য হবে। আউটপুট দেখাচ্ছে যে লাস্ট লাইনের পাথ ভ্যালুগুলো রিভার্স হয়েছে।
উদাহরণ ৩: /etc/passwd ফাইলে ইউজারনেমের লিস্ট পান
এই sed উদাহরণ /etc/passwd ফাইল থেকে শুধু প্রথম ফিল্ড দেখায়।
$sed 's/\([^:]*\).*/\1/' /etc/passwd root bin daemon adm lp sync shutdown
উদাহরণ ৪: প্রতিটি শব্দের প্রথম ক্যারেক্টার প্যারেনথেসাইজ করুন
এই sed উদাহরণ প্রতিটি শব্দের প্রথম ক্যারেক্টার প্যারেনথেসিসে প্রিন্ট করে।
$ echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g' (W)elcome (T)o (T)he (G)eek (S)tuff
উদাহরণ ৫: সিম্পল নম্বর কমিফাই (Commify) করুন।
numbers নামে ফাইল তৈরি করুন যাতে নম্বর들의 লিস্ট আছে। নিচের sed কমান্ড উদাহরণটি হাজার পর্যন্ত নম্বর কমিফাই করতে ব্যবহৃত হয়।
$ cat numbers 1234 12121 3434 123 $sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers 1,234 12,121 3,434 123