রিদওয়ান বিন শামীম
আজকের টিউটোরিয়ালে আমরা দেখব কীভাবে sed তে রেগুলার এক্সপ্রেশন ব্যবহার করা হয়।
এসইডিকে ইনভোক করা
পাইপের মাধ্যমে এসইডিতে ডাটা প্রেরণ করে একে ইনভোক করা যায়,
$ cat /etc/passwd | sed Usage: sed [OPTION]... {script-other-script} [input-file]... -n, --quiet, --silent suppress automatic printing of pattern space -e script, --expression=script ...............................
এসইডির জন্য সাধারণ সিনট্যাক্স
এসইডির জন্য সাধারণ সিনট্যাক্স এরকম,
/pattern/action
এখানের স্ল্যাস ক্যারেক্টারগুলো ডিলিমিটার হিসেবে ব্যবহৃত হয়।
রেঞ্জ | বিবরণ |
p | লাইন প্রিন্ট করে |
d | লাইন ডিলিট করে |
s/pattern1/pattern2/ | প্যাটার্ন ১ এর ঘটনাকে প্যাটার্ন ২ দ্বারা প্রতিস্থাপন করে। |
এসইডিতে লাইন ডিলিট করতে
লাইন ডিলিট করতে নিচের কম্যান্ড ব্যবহৃত হয়,
$ cat /etc/passwd | sed 'd' $
cat command ছাড়া এই কম্যান্ডও অনুরূপ কাজ করে,
$ sed -e 'd' /etc/passwd $
এসইডি এড্রেসিং
এসইডি কম্যান্ডে বেসিক এড্রেস যোগ করতে যে কম্যান্ড ব্যবহার করতে পারি,
$ cat /etc/passwd | sed '1d' |more daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh $
এসইডি কম্যান্ডে এড্রেস রেঞ্জ নির্ধারণ করতে আমরা যে কম্যান্ড ব্যবহার করতে পারি তা হল,
$ cat /etc/passwd | sed '1, 5d' |more games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh $
উপরের কম্যান্ড এক থেকে পাঁচ নাম্বার পর্যন্ত লাইন ডিলিট করতে ফলপ্রসূ হবে।
আরও কিছু এড্রেস রেঞ্জের উদাহরণ,
রেঞ্জ |
'4,10d' |
'10,4d' |
'4,+5d' |
'2,5!d' |
'1~3d' |
'2~2d' |
'4,10p' |
'4,d' |
',10d' |
মনে রাখা দরকার, p একশন ব্যবহারের সময় পুনরাবৃত্তি এড়াতে -n অপশন ব্যবহার করা উচিৎ,
$ cat /etc/passwd | sed -n '1,3p'
এই কম্যান্ডকে -n ছাড়া ব্যবহার করলে যা পাচ্ছি,
$ cat /etc/passwd | sed '1,3p'
সাবস্টিটিউশন কম্যান্ড
স্ট্রিং root কে amrood স্ট্রিং দ্বারা প্রতিস্থাপিত করতে কম্যান্ড,
$ cat /etc/passwd | sed 's/root/amrood/' amrood:x:0:0:root user:/root:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh ..........................
এসইডিকে গ্লোবাল সাবস্টিটিউশনের নির্দেশ দিতে কম্যান্ডের শেষে g লাগাতে হয়,
$ cat /etc/passwd | sed 's/root/amrood/g' amrood:x:0:0:amrood user:/amrood:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh
সাবস্টিটিউশন ফ্ল্যাগ
অনেকগুলো সাবস্টিটিউশন ফ্ল্যাগ আছে যার মধ্যে একই সময়ে একাধিককে স্পেসিফাই করে দিতে পারি আমরা,
ফ্ল্যাগ |
g |
NUMBER |
p |
w FILENAME |
I or i |
M or m |
অলটারনেটিভ স্ট্রিং সেপারেটর ব্যবহার করা
s এর পড়ে কাঙ্খিত ক্যারেক্টার ব্যবহার করে বিভিন্ন সেপারেটর ব্যবহার করা যায়।
$ cat /etc/passwd | sed 's:/root:/amrood:g' amrood:x:0:0:amrood user:/amrood:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh
এম্পটি স্পেস দ্বারা রিপ্লেস করা
/etc/passwd ফাইল থেকে রুট স্ট্রিং ডিলিট করার জন্য এম্পটি সাবস্টিটিউশন স্ট্রিং ব্যবহার করতে পারি,
$ cat /etc/passwd | sed 's/root//g' :x:0:0::/:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh
এড্রেস সাবস্টিটিউশন
কেবল দশম লাইনের string shকে string quiet দ্বারা সাবস্টিটিউট করতে,
$ cat /etc/passwd | sed '10s/sh/quiet/g' root:x:0:0:root user:/root:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/quiet
একইভাবে, এড্রেস রেঞ্জ সাবস্টিটিউশন করতে,
$ cat /etc/passwd | sed '1,5s/sh/quiet/g' root:x:0:0:root user:/root:/bin/quiet daemon:x:1:1:daemon:/usr/sbin:/bin/quiet bin:x:2:2:bin:/bin:/bin/quiet sys:x:3:3:sys:/dev:/bin/quiet sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh
ম্যাচিং কম্যান্ড
-n অপশনের সাথে p অপশন ব্যবহার করে ম্যাচিং লাইন প্রিন্ট করতে পারি,
$ cat testing | sed -n '/root/p' root:x:0:0:root user:/root:/bin/sh [root@ip-72-167-112-17 amrood]# vi testing root:x:0:0:root user:/root:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh
রেগুলার এক্সপ্রেশন ব্যবহার করা
daemon দিয়ে করা লাইন খুঁজে বের করে ডিলিট করতে,
$ cat testing | sed '/^daemon/d' root:x:0:0:root user:/root:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh
sh দিয়ে শেষ এমন লাইনের ক্ষেত্রে ডিলিটের কম্যান্ড,
$ cat testing | sed '/sh$/d' sync:x:4:65534:sync:/bin:/bin/sync
রেগুলার এক্সপ্রেশনের জন্য গুরুত্বপূর্ণ এমন চারটি স্পেশাল ক্যারেক্টার,
ক্যারেক্টার |
^ |
$ |
. |
* |
[chars] |
ম্যাচিং ক্যারেক্টার
ম্যাচিং ক্যারেক্টারের কিছু প্যাটার্ন দেয়া হল,
এক্সপ্রেশন |
/a.c/ |
/a*c/ |
/[tT]he/ |
/^$/ |
/^.*$/ |
/ */ |
/^$/ |
বহুল ব্যবহৃত কিছু ক্যারেক্টার সেট নিচে দেয়া হল,
সেট |
[a-z] |
[A-Z] |
[a-zA-Z] |
[0-9] |
[a-zA-Z0-9] |
ক্যারেক্টার ক্লাস কীওয়ার্ড
/etc/syslog.conf ফাইলের উদাহরণে এলফাবেট ক্যারেক্টার ক্লাস কীওয়ার্ড ব্যবহৃত হয়েছে।
$ cat /etc/syslog.conf | sed -n '/^[[:alpha:]]/p' authpriv.* /var/log/secure mail.* -/var/log/maillog cron.* /var/log/cron uucp,news.crit /var/log/spooler local7.*
জিএনইউ এসইডিতে পাওয়া ক্যারেক্টার ক্লাস কীওয়ার্ডের একটি তালিকা নিচে দেয়া হল,
ক্যারেক্টার ক্লাস |
[[:alnum:]] |
[[:alpha:]] |
[[:blank:]] |
[[:cntrl:]] |
[[:digit:]] |
[[:graph:]] |
[[:lower:]] |
[[:print:]] |
[[:punct:]] |
[[:space:]] |
[[:upper:]] |
[[:xdigit:]] |
এম্পারসেন্ড রেফারেন্সিং
ধরা যাক, নিচের ফাইলে ফোননাম্বার আছে, এতে এরিয়া কোড বসাতে হবে,
5555551212 5555551213 5555551214 6665551215 6665551216 7775551217
এম্পারসেন্ড রিপ্লেসমেন্ট ক্যারেক্টার বসিয়ে এটি করতে হলে যা করতে হবে তা হল,
$ sed -e 's/^[[:digit:]][[:digit:]][[:digit:]]/(&)/g' phone.txt (555)5551212 (555)5551213 (555)5551214 (666)5551215 (666)5551216 (777)5551217
মাল্টিপল এসইডি কম্যান্ড ব্যবহার
সিঙ্গেল এসইডি কম্যান্ডে মাল্টিপল এসইডি কম্যান্ড ব্যবহার করতে নিচের কম্যান্ড ব্যবহার করতে পারি,
$ sed -e 'command1' -e 'command2' ... -e 'commandN' files
একই কৌশল ব্যবহার করে ফোন নাম্বার উদাহরণকে আমরা এভাবে লিখতে পারি,
$ sed -e 's/^[[:digit:]]\{3\}/(&)/g' \ -e 's/)[[:digit:]]\{3\}/&-/g' phone.txt (555)555-1212 (555)555-1213 (555)555-1214 (666)555-1215 (666)555-1216 (777)555-1217
ব্যাক রেফারেন্স
ধরা যাক, অনুমিত ফোন টেক্সটে এই টেক্সটগুলো আছে,
(555)555-1212 (555)555-1213 (555)555-1214 (666)555-1215 (666)555-1216 (777)555-1217
এতে নিচের কম্যান্ড প্রয়োগ করা যেতে পারে,
$ cat phone.txt | sed 's/\(.*)\)\(.*-\)\(.*$\)/Area \ code: \1 Second: \2 Third: \3/' Area code: (555) Second: 555- Third: 1212 Area code: (555) Second: 555- Third: 1213 Area code: (555) Second: 555- Third: 1214 Area code: (666) Second: 555- Third: 1215 Area code: (666) Second: 555- Third: 1216 Area code: (777) Second: 555- Third: 1217