Using SED Command

May 8 2016

sed ဆိုတာ Stream Editor အတိုကောက်ပါ။ command တစ်ခုခုရဲ့ output text stream ကိုဖြစ်စေ၊ file ထဲက text တွေကိုဖြစ်စေ ရှာဖွေခြင်း၊ ပြင်ဆင်ခြင်းများပြုလုပ်နိုင်ပါတယ်။ grep, awk တို့နဲ့အမြဲတွဲသုံးလေ့ရှိပါတယ်။ sed ကိုလေ့လာဖို့ ထုံးစံအတိုင်း လိုအပ်တဲ့ဖိုင်လေးတစ်ခုပြုလုပ်ပါမယ်။

#Yangon Regions
#
Htaukkyant Mhawbi Hlegu
Taikgyi Okkan
Apyauk
Htantabin Shwepyaytha
HlaingTharyar DagonMyothit

Thanlyin Kyauktan Thonegwa
KhaYan Twante
Kawthmu Kungyangon
CocoIsland
Yangon

ပေးထားတဲ့ Text ကို Text Editor တစ်ခုခုထဲ ကူးထည့်ပြီး ygn.txt နာမည်နဲ့ Desktop ပေါ်မှာ Save လုပ်လိုက်ပါ။

sed command ရဲ့ အခြေခံအသုံးပြုပုံကတော့ အောက်ပါအတိုင်းဖြစ်ပါတယ်။

sed [option] 'commands' file_to_edit

အခု ygn.txt ဖိုင်ရဲ့ content အားလုံးကို ထုတ်ကြည့်ပါမယ်။

Command

$ sed '' ~/Desktop/ygn.txt

Output

#Yangon Regions
#
Htaukkyant Mhawbi Hlegu
Taikgyi Okkan
Apyauk
Htantabin Shwepyaytha
HlaingTharyar DagonMyothit

Thanlyin Kyauktan Thonegwa
KhaYan Twante
Kawthmu Kungyangon
CocoIsland
Yangon

ဘာ option ဘာ command မှထည့်မထားတဲ့အတွက် အရှိအတိုင်းပဲ ထုတ်ပြပေးသွားတာပါ။ ဒီတစ်ခါတော့ Print command p ကို သုံးကြည့်ပါမယ်။

Command

$ sed 'p' ~/Desktop/ygn.txt

Output

#Yangon Regions
#Yangon Regions
#
#
Htaukkyant Mhawbi Hlegu
Htaukkyant Mhawbi Hlegu
Taikgyi Okkan
Taikgyi Okkan
Apyauk
Apyauk
Htantabin Shwepyaytha
Htantabin Shwepyaytha
HlaingTharyar DagonMyothit
HlaingTharyar DagonMyothit


Thanlyin Kyauktan Thonegwa
Thanlyin Kyauktan Thonegwa
KhaYan Twante
KhaYan Twante
Kawthmu Kungyangon
Kawthmu Kungyangon
CocoIsland
CocoIsland
Yangon
Yangon

ရှိရှိသမျှစာကြောင်းတိုင်းကို ၂ကြိမ်ဆီရိုက်ထုတ်ပြတာကိုတွေ့ရမှာဖြစ်ပါတယ်။ ဘာကြောင့်လဲဆိုတော့ sed command က အလိုအလျှောက် ရိုက်ထုတ်ပေးတာကို p command နဲ့ ထပ်ပြီး print ထုတ်ခိုင်းလိုက်တဲ့အတွက်ကြောင့်ပါ။ စာကြောင်းတစ်ကြောင်းကို ၂ကြိမ်၂ကြိမ်ဆီရိုက်ထုတ်သွားတာကို ကြည့်ခြင်းအားဖြင့် ပေးလိုက်တဲ့ command ကို sed က တစ်ကြောင်းခြင်း process လုပ်တယ်ဆိုတာ သဘောပေါက်မယ်ထင်ပါတယ်။ Command အတိအကျပေးပြီး ထုတ်ခိုင်းတဲ့ result ကိုသာလိုချင်တယ်ဆိုလျှင်တော့ -n option ကိုသုံးရပါလိမ့်မယ်။

Command

$ sed -n 'p' ~/Desktop/ygn.txt

Output

#Yangon Regions
#
Htaukkyant Mhawbi Hlegu
Taikgyi Okkan
Apyauk
Htantabin Shwepyaytha
HlaingTharyar DagonMyothit

Thanlyin Kyauktan Thonegwa
KhaYan Twante
Kawthmu Kungyangon
CocoIsland
Yangon

ဒီတစ်ခါတော့ ဖိုင်ထဲက လိုချင်တဲ့စာကြောင်းကိုပဲ ရွေးထုတ်ကြည့်ပါမယ်။

ပထမဦးဆုံးစာကြောင်း -

Command

$ sed -n '1p' ~/Desktop/ygn.txt

Output

#Yangon Regions

ခုနစ်ကြောင်းမြောက်စာကြောင်း -

Command

$ sed -n '7p' ~/Desktop/ygn.txt

Output

HlaingTharyar DagonMyothit

နောက်ဆုံးစာကြောင်း -

Command

$ sed -n '$p' ~/Desktop/ygn.txt

Output

Yangon

၃ကြောင်းမြောက်ကနေ ၇ကြောင်းမြောက်ထိကိုလိုချင်လျှင်တော့ comma (,) ခံပြီးရေးပေးရုံပါပဲ။

Command

$ sed -n '3,7p' ~/Desktop/ygn.txt

Output

Htaukkyant Mhawbi Hlegu
Taikgyi Okkan
Apyauk
Htantabin Shwepyaytha
HlaingTharyar DagonMyothit

၃ကြောင်းမြောက်နဲ့ ၇ကြောင်းမြောက်အတွင်းမှာရှိတဲ့ စာကြောင်း ၅ကြောင်းကိုဖယ်ပြီးကျန်တဲ့စာကြောင်းအားလုံးကို လိုချင်လျှင်တော့ !p ကိုသုံးရပါတယ်။

Command

$ sed -n '3,7!p' ~/Desktop/ygn.txt

Output

#Yangon Regions
#

Thanlyin Kyauktan Thonegwa
KhaYan Twante
Kawthmu Kungyangon
CocoIsland
Yangon

အခု နောက်ထပ်တစ်နည်းအနေနဲ့ RegEx (Regular Expression) ကိုသုံးပြီး ရှာဖွေကြည့်ပါမယ်။

Command

$ sed -n '/yangon/p' ~/Desktop/ygn.txt

Output

Kawthmu Kungyangon

#Yangon Regions, Kawthmu Kungyangon နဲ့ Yangon ဆိုပြီး သုံးကြောင်းရှိပေမယ့် စာလုံး အကြီး၊ အသေး ကွဲပြားတာကြောင့် Y အကြီးနဲ့ရေးထားတဲ့စာကြောင်းတွေမပါလာပဲ ကွက်တိမတူပေမယ့် yangon ဆိုတဲ့စာလုံးတွဲပါတဲ့ Kungyangon ကိုထုတ်ပြပေးတာပါ။ Y အကြီး၊ အသေး ၂မျိုးလုံးပါစေချင်တယ်ဆိုလျှင်တော့ [] ထဲထည့်ရေးပေးလိုက်ပါ။

Command

$ sed -n '/[Yy]angon/p' ~/Desktop/ygn.txt

Output

#Yangon Regions
Kawthmu Kungyangon
Yangon

Hta နဲ့စတဲ့စာကြောင်းတွေကိုလိုချင်တယ်ဆိုလျှင်တော့ RegEx ရဲ့ ^ ကို သုံးနိုင်ပါတယ်။

Command

$ sed -n '/^Hta/p' ~/Desktop/ygn.txt

Output

Htaukkyant Mhawbi Hlegu
Htantabin Shwepyaytha

စာကြောင်းအစကို ^ နဲ့သတ်မှတ်သလို အဆုံးကိုလည်း $ နဲ့သတ်မှတ်ပါတယ်။

Command

$ sed -n '/Twante$/p' ~/Desktop/ygn.txt

Output

KhaYan Twante

အစ ^ နဲ့ အဆုံး $ ကိုဘာစာလုံးနဲ့မှမတွဲပဲ နှစ်ခုတည်း ^$ အနေနဲ့ တွဲလိုက်လျှင်တော့ Blank Line ကိုဆိုလိုတာပါ။ နမူနာဖိုင်ရဲ့ ၈ကြောင်းမြောက်မှာ ဘာစာသားမှမရေးထားပဲ တစ်ကြောင်းကျော်ထားတာရှိပါတယ်။ အဲဒီလို Blank Line တွေကို မပါစေချင်ဘူးဆိုလျှင်တော့ d command ကိုသုံးပြီးဖယ်ထုတ်ပြသနိုင်ပါတယ်။

Command

$ sed '/^$/d' ~/Desktop/ygn.txt

Output

#Yangon Regions
#
Htaukkyant Mhawbi Hlegu
Taikgyi Okkan
Apyauk
Htantabin Shwepyaytha
HlaingTharyar DagonMyothit
Thanlyin Kyauktan Thonegwa
KhaYan Twante
Kawthmu Kungyangon
CocoIsland
Yangon

-n option မသုံးထားတာကို သတိထားမိမယ်ထင်ပါတယ်။ p (print) command မဟုတ်တဲ့အတွက်ကြောင့်ပါ။

Blank Line တွေမပါတဲ့ သီးသန့် ဖိုင်တစ်ခုပြလုပ်ချင်တယ်ဆိုလျှင်တော့ > နဲ့ sed ရဲ့ output ကို ဖိုင်နာမည်တစ်ခုနဲ့ redirect လုပ်ပြီး သိမ်းနိုင်ပါတယ်။

Command

$ sed '/^$/d' ~/Desktop/ygn.txt > ~/Desktop/ygn2.txt
cat ~/Desktop/ygn2.txt

Output

#Yangon Regions
#
Htaukkyant Mhawbi Hlegu
Taikgyi Okkan
Apyauk
Htantabin Shwepyaytha
HlaingTharyar DagonMyothit
Thanlyin Kyauktan Thonegwa
KhaYan Twante
Kawthmu Kungyangon
CocoIsland
Yangon

ဒီနည်းအတိုင်း d command နဲ့ မလိုအပ်တဲ့ စာကြောင်းတွေကိုဖယ်ရှားနိုင်ပါသေးတယ်။

Command

$ sed '/^#/d' ~/Desktop/ygn.txt > ~/Desktop/ygn2.txt
cat ~/Desktop/ygn2.txt

Output

Htaukkyant Mhawbi Hlegu
Taikgyi Okkan
Apyauk
Htantabin Shwepyaytha
HlaingTharyar DagonMyothit

Thanlyin Kyauktan Thonegwa
KhaYan Twante
Kawthmu Kungyangon
CocoIsland
Yangon

Command

$ sed '/[Yy]angon/d' ~/Desktop/ygn.txt > ~/Desktop/ygn2.txt
cat ~/Desktop/ygn2.txt

Output

#
Htaukkyant Mhawbi Hlegu
Taikgyi Okkan
Apyauk
Htantabin Shwepyaytha
HlaingTharyar DagonMyothit
Thanlyin Kyauktan Thonegwa
KhaYan Twante
CocoIsland

sed ကို ရှာဖွေတာ နဲ့ ရှင်းထုတ်တာအပြင် နောက်ထပ် အဓိကအနေနဲ့ အသုံးများတဲ့နည်းလမ်းကတော့ အစားထိုးပြင်ဆင်တာပါပဲ။ Text Editor တွေမှာပါတဲ့ Find and Replace ဆိုတာမျိုးကို sed က ဆောင်ရွက်ပေးနိုင်ပါတယ်။ တစ်နည်းအားဖြင့်ပြောရရင် Substitution ပါပဲ။ အဲဒီအတွက် s command ကိုသုံးပါမယ်။ အသုံးပြုပုံကတော့ အောက်ပါအတိုင်းဖြစ်ပါတယ်။

$ sed 's/[old_word]/[new_word]/' file_to_edit

Yangon ကို Rangoon နဲ့အစားထိုးကြည့်ပါမယ်။

Command

$ sed 's/Yangon/Rangoon/' ~/Desktop/ygn.txt

Output

#Rangoon Regions
#
Htaukkyant Mhawbi Hlegu
Taikgyi Okkan
Apyauk
Htantabin Shwepyaytha
HlaingTharyar DagonMyothit

Thanlyin Kyauktan Thonegwa
KhaYan Twante
Kawthmu Kungyangon
CocoIsland
Rangoon

's/Yangon/Rangoon/' ဆိုတဲ့နေရာမှာ s က (substitute) command ဖြစ်ပြီး / သုံးခုကတော့ delimiter အနေနဲ့ စာသားကို ပိုင်းခြားသတ်မှတ်ပေးတာဖြစ်ပါတယ်။ / အစား တခြား character တွေကိုလည်းသုံးနိုင်ပါတယ်။ ဥပမာ / တွေအများကြီးပါတဲ့ url လို စာသားမျိုးကို ပြင်ဆင်တဲ့နေရာမှာ / နဲ့ ခွဲခြားသတ်မှတ်မယ်ဆိုလျှင် ရှုပ်ထွေးသွားနိုင်တဲ့အတွက် / အစား _ နဲ့ပြောင်းလဲအသုံးပြုနိုင်ပါတယ်။

Command

$ echo "http://naingyeminn.net/post/2/" | sed 's_net/post_com/page_'

Output

http://naingyeminn.com/page/2/

delimiter ကိုတော့ သုံးနေရာမှန်မှန်ကန်ကန်ထားရှိဖို့တော့လိုပါတယ်။ / မဟုတ်ပဲ အခြား character ပြောင်းသုံးတဲ့နေရာမှာ နောက်ဆုံး အပိတ် delimiter ကိုမေ့ကျန်လေ့ရှိတတ်ပါတယ်။ ကျန်နေခဲ့လျှင်တော့ Error Message ပြပါလိမ့်မယ်။

Command

$ echo "http://naingyeminn.net/post/2/" | sed 's_net/post_com/page'

Output

sed: 1: "s_net/post_com/page": unterminated substitute in regular expression

ပြန်လည်ပြင်ဆင်တာ အစားထိုးတာတွေလုပ်ပြီးတဲ့အခါမှာ အဲဒီ ပြင်ဆင် အစားထိုးတာတွေကို အထက်မှာပြောခဲ့တဲ့နည်းအတိုင်း > နဲ့ ဖိုင်နာမည်တစ်ခုပေးပြီး သိမ်းနိုင်ပါတယ်။ အဲလိုမှမဟုတ်ပဲ မူရင်းဖိုင်မှာပဲ overwrite လုပ်ချင်တယ်ဆိုလျှင်တော့ -i option ကိုသုံးနိုင်ပါတယ်။

Command

$ sed -i.bak 's/Yangon/Rangoon/' ygn.txt

Output အနေနဲ့ screen မှာမတွေ့ရပေမယ့် ygn.txt ထဲမှာတော့ Rangoon တွေ ဖြစ်သွားပါလိမ့်မယ်။ -i နောက်မှာ .bak လို့တွဲထည့်ထားတာကတော့ မူရင်း Yangon နဲ့ဖိုင်ကို ygn.txt ကို backup အနေနဲ့ ygn.txt.bak ဆိုပြီးပြောင်းပြီး သိမ်းစေဖို့ပါ။

sed version ပေါ်မူတည်ပြီး -i အသုံးပြုပုံကကွာခြားပါတယ်။ အချို့ Operating System တွေမှာတော့ -i နောက်မှာ backup အတွက် .bak value မျိုး ထည့်ပေးစရာမလိုပဲ original ဖိုင်ကို တမ်းပြောင်းနိုင်ပါတယ်။ နောက်ပိုင်း version တွေမှာတော့ မှားပြီး ပြောင်းမိတာမျိုးမဖြစ်ရအောင် မဖြစ်မနေ backup သိမ်းရပါတယ်။

အခု ရှင်းလင်းပြသထားတဲ့ အသုံးပြုပုံတွေက sed ကိုနားလည်နိုင်ရုံ အခြေခံလောက်ပဲဖြစ်ပါတယ်။ RegEx နဲ့တွဲဖက်ပြီး Text/Data Processing တွေ၊ Automation တွေ မျိုးစုံပြုလုပ်အသုံးပြုနိုင်ပါတယ်။ SysAdmin တွေအတွက်သာမက Developer တွေအတွက်ပါ အလွန်အသုံးဝင်တဲ့ tool တစ်ခုဖြစ်တဲ့အတွက် ဒီထက်ပိုပြီးလေ့လာဖို့တိုက်တွန်းချင်ပါတယ်။


comments powered by Disqus