ইউনিক্স – SED এর সাথে রেগুলার এক্সপ্রেশন (Unix – Regular Expressions with SED)

রিদওয়ান বিন শামীম

 

আজকের টিউটোরিয়ালে আমরা দেখব কীভাবে 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

 

Permanent link to this article: http://bangla.sitestree.com/%e0%a6%87%e0%a6%89%e0%a6%a8%e0%a6%bf%e0%a6%95%e0%a7%8d%e0%a6%b8-sed-%e0%a6%8f%e0%a6%95%e0%a7%8d%e0%a6%b8%e0%a6%aa%e0%a7%8d%e0%a6%b0%e0%a7%87%e0%a6%b6%e0%a6%a8/

Leave a Reply