Using SED Command
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 တစ်ခုဖြစ်တဲ့အတွက် ဒီထက်ပိုပြီးလေ့လာဖို့တိုက်တွန်းချင်ပါတယ်။