এই নিবন্ধটি চলমান ইউনিক্স সেড টিপস এবং ট্রিক্স সিরিজের অংশ।
আমাদের আগের sed নিবন্ধগুলিতে আমরা শিখেছি — sed প্রিন্টিং, sed মুছে ফেলা, sed বিকল্প , sed ফাইল লিখতে এবং একাধিক কমান্ড sed৷
এই নিবন্ধে, আসুন কিছু বাস্তব উদাহরণ সহ sed-এ "s" বিকল্প কমান্ডের সাথে কিছু আকর্ষণীয় সমাধান পর্যালোচনা করি৷
আমি। 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
উদাহরণ 1 – sed @ delimiter:বিকল্প /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
উদাহরণ 2 – sed / delimiter:বিকল্প /opt/omni/lbin কে /opt/tools/bin
যখন আপনার পাথ নাম সম্পর্কিত প্রতিস্থাপনে '/' ব্যবহার করা উচিত, তখন আপনাকে নীচে দেখানো হিসাবে প্রতিস্থাপন ডেটাতে '/' এড়িয়ে যেতে হবে। এই সেড উদাহরণে, 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 '&' Get Matched String
একটি ইনপুট লাইনের সুনির্দিষ্ট অংশ যার উপর রেগুলার এক্সপ্রেশন মেলে &দ্বারা প্রতিনিধিত্ব করা হয়, যা তারপর প্রতিস্থাপন অংশে ব্যবহার করা যেতে পারে।
উদাহরণ 1 – 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
দিয়ে প্রতিস্থাপিত হবেউদাহরণ 2 – 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-এ ব্যাক-রেফারেন্সগুলি রেগুলার এক্সপ্রেশন এবং বিকল্প কমান্ডের প্রতিস্থাপন অংশ উভয় ক্ষেত্রেই ব্যবহার করা যেতে পারে।
উদাহরণ 1:প্রতিটি লাইনে শুধুমাত্র প্রথম পথ পান
$ sed 's/\(\/[^:]*\).*/\1/g' path.txt /usr/kbos/bin /usr/local/sbin /opt/omni/lbin
উপরের উদাহরণে, \(\/[^:]*\) প্রথম :আসার আগে উপলব্ধ পথের সাথে মেলে। \1 প্রথম মিলিত গ্রুপ প্রতিস্থাপন করে।
উদাহরণ 2:মাল্টিগ্রুপিং
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
উপরের কমান্ডে $ শুধুমাত্র শেষ লাইনের জন্য প্রতিস্থাপনকে নির্দিষ্ট করে। আউটপুট দেখায় যে শেষ লাইনে পাথের মানগুলির ক্রম বিপরীত করা হয়েছে।
উদাহরণ 3:/etc/passwd ফাইলে ব্যবহারকারীর নামের তালিকা পান
এই sed উদাহরণটি শুধুমাত্র /etc/passwd ফাইল থেকে প্রথম ক্ষেত্রটি প্রদর্শন করে।
$sed 's/\([^:]*\).*/\1/' /etc/passwd root bin daemon adm lp sync shutdown
উদাহরণ 4:প্রতিটি শব্দের প্রথম অক্ষর বন্ধনী করুন
এই sed উদাহরণটি প্যারান্থেসিসে প্রতিটি শব্দের প্রথম অক্ষর প্রিন্ট করে।
$ echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g' (W)elcome (T)o (T)he (G)eek (S)tuff
উদাহরণ 5:সাধারণ সংখ্যা কমিফাই করুন।
সংখ্যা নামক ফাইল তৈরি করা যাক যেখানে সংখ্যার তালিকা আছে। নিচের 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