කොමෙන්ට්ස් දැමීම සම්බන්ධවයි.

ඔබගේ අදහස් ඉතා ගෞරව පුර්වකව අගය කරමි. කරුණාකර කෙලින්ම හෝ ව්‍යංගයෙන් (උදාහරණ ලෙස මුලට හෝ අගට තරු ලකුණු සතිතව) නරක වචන (කුණුහරුප) යෙදීමෙන්වලකින්න

Monday, October 25, 2010

sed - ස්ට්‍රීම් එඩිටර්



ගොඩක් දවසකට පස්සේ post එකක් දාන්න හේතුවක් උද උන.

මේ දවස් වල පොඩි exam එකකට රෙඩි වෙන හින්ද, පොත්, notes අරගෙන ඇදට සෙට් උන. එත් ඉතින් නෙට් එකේ search කරන්න වෙන වර අනන්තයි නේ. ලැප් එක ඇදට අරගෙන යන එකත් වාතේ. ඔය අවුල මම ටික දවසකට කලින් ලිහ ගත්ත. වෙලාවක් තිබ්බොත් එක ගැනත් විස්තර ඇතිව පොස්ට් එකක් දැන්නම් පස්සේ වෙලාවක. කෙටියෙන් මෙහෙමයි.

මගේ ලැප්ටොප් එකේ wireless card එක ad-hoc . support කරනවා. එ කියන්නේ ඕනෙනම් provider කෙනෙක් විදිහට වැඩ කරන්න පුළුවන්. ඉතින් මම කරේ wifi connection එකක් හැදුව  මගේ ඉන්ටෙර්නෙට් connection එක share කරලා. එච්චරයි. මගේ Phone එක දැන් wifi  area එකක. (දැන් ඉතින් අපේ ගේ ගාවට ඇවිත් wifi  search කරන්න එපා. security add කරලා තියෙන්නේ :) ). 



අදත් ඔන්න මොනවා හරි එකක් search කරන්න ඕනේ උණා. ගූග්ලේ නේ ඕනේ දෙකට ඉන්න දෙයිය. google.com බූක් මාර්ක් එකෙන්ම ගියා. ඊයේ මොකද්ද වැඩකට මම cache  remove කල. එහින්ද google . com  එක google . lk  එකට redirect උන. මෙන්න බොලේ iPhone සෆාරි වල සිංහල අකුරු පේනවා. එත් මට sure නෑ. කවුද  දන්නේ images  පෙන්නනවද කියල. මම කෙලින්ම මගේ බ්ලොග් එකට ගිහින් බැලුව. නයි කයිද මැටි පාන් කිව්වලු. මේ පෙන්නේ සිංහල unicode කොර වෙන්න. (කොර වෙලා තමයි පෙන්නේ. පොඩි rendering අවුලක් තියනවා.)

තිබුණු ෆිට් එකට ෆොනේ එකෙන්ම මගේ බ්ලොග් එකේ පොස්ට් ටික බැලුව. කවුද කෙනෙක් මගේ grep සහ or පොස්ට් එකට comment එකක් දල. sed ගැනත් පොස්ට් එකක් දන්නා කියල.

මේ sed ගැන

සරලව කිව්වොත් sed කියන්නේ stream editor එකක්. "man sed -  " sed - stream editor for filtering and transforming text 

මටනම් sed සාමාන්යෙන් පාවිච්චි කරන්න වෙලා තියෙන්නේ අඩුවෙන්, එත් ගොඩක් useful ටූල් එකක්. උදහරනයක්ම ගමුකො.
හිතන්න මොකක් හරි stream (file , input , pipe වගේ ඕනේ එකක් stream ) එකක තියන ඔරිගීනල් text  එක වෙනස් කරලා stream එකක් ඕනේ කියල

උද: "This is the input" >> "This is the output"
echo 'This is the input' | sed 's/input/output'

මෙතන
s  - කියන්නේ sed command එක (substitute)
/ - කියන්නේ delimiter එක
"input" - search pattern එක (regular expression)
 "output" - replacement තෙෂ්ත
echo 'This is the input' එක pipe කරලා තියනවා sed එකට

මේක ටිකක් සරල අවස්ථාවක්. මීට වැඩ ටිකක් සංකීර්ණ එකක් බලමු.
අපේ ස්ට්‍රින්ග්  එක  තමයි.
 "This para has 3 numbers. 123 is the first and 456 is another and 789 is at last."
මගේ උත්සාහය තමයි numbers තියන හැම එකම වරහන් ඇතුලට දාන එක. එකියන්නේ මගේ output  එක වෙන්න ඕනේ  "This para has (3) numbers. (123) is the first and (456) is another and (789) is at last."

ඉස්සරලා එකනම් කෙලින්ම කරන්න පුළුවන් උන. text එකක් replace කරපු එක තමයි එකනදී උනේ. එත් දැන් අපි pattern එකක් replace කරන්න විදිහයි හොයා ගන්න ඕනේ. මෙතැනදී එන ලොකුම ගැටලුව numbers හොයා ගන්න එක නෙවෙයි. [0-9][0-9]* කියන්නේ ඕනෑම number එකක් නේ . එත් ඒ විතරක් මදිනේ, හොයා ගත්ත number එකත් ඕනනේ වරහන් ඇතුලට දාන්න.

වැඩිය ලොකුවට හිතන්න ඕනේ නේ. sed එකේදී match උණු text එක & එකෙන් ගන්න පුළුවන්.
හරි එහෙනම් මේකයි script එක 

echo "This para has 3 numbers. 123 is the first and 456 is another and 789 is at last." | sed 's/[0-9][0-9]*/(&)/'

හ්ම්ම් හරි කියලද හිතන්නේ. නෑ කරලා බැලුවොත් තේරෙයි. output එක තමයි
This para has (3) numbers. 123 is the first and 456 is another and 789 is at last.
ඒ කියන්නේ පලවෙනි match එක විතරයි replace කරලා තියෙන්නේ .

ඔක්කොම match replace කරන්න නම් g (global) option  එකත් දෙන්න ඕනේ. මෙහෙමයි එක කරන්නේ

echo "This para has 3 numbers. 123 is the first and 456 is another and 789 is at last." | sed 's/[0-9][0-9]*/(&)/g /'

මේකයි output එක
"This para has (3) numbers. (123) is the first and (456) is another and (789) is at last."

වැඩේ හරිනේ.

තව එක උදාහරණයක් බලමු. මම grep ගැන කියද්දී කිව්වා කොහොමද line number එක ගන්නේ කියල. එකේදී match වෙන text එකට කලින් line numbers එනවා. එත් line numbers විතරක් ගන්න විදිහක් grep එකෙන් හොයා ගන්න අමාරුයි. අපි ග්‍රේප් output එක sed වලට pipe කරමු . ඊට පස්සේ line විතරක් එන්න stream එක edit කරමු sed එකෙන්

grep -n 'are\|line' mytextfile.txt | sed 's/:.*//'

:.* කියන ටික තේරුනේ නැද්ද? මේකයි එතැනදී වෙන්නේ grep -n output  එක "23:Matched text " වගේනේ. මම කරන්නේ ":" එක සහ ඊට පසුව එන සියලු text empty කරන එක. ඉතින් අන්තිමට ඉතුරු වෙන්නේ මුලින් තිබුණු line number එක විතරයි.

ඕකම sed එක විතරක් යොදාගෙනත් කරන්න පුළුවන්
sed -ne '/are\|line' = mytextfile.txt

තව දෙයක් කියන්න ඕනේ. මම මෙතැනදී sed එකේ එක command එකක් විතරයි පැහැදිලි කරේ. තව ගොඩක් දේවල් තියනවා කතා කරනවානම්. එත් දැන් ඇති. උත්සහ කරලා බලන්න. වැදගත් දෙයක් තියනවනම් comment එකක් දාන්න.