2008年11月21日星期五

bash parse line by line

尋日寫個script去一行行咁process一個list(你可以當係ls 嘅result),上google search "bash parse line by line"搵極都搵唔到個啱我用嘅example.以我嘅性格,通常明知係得嘅我會堅持,亦即係正所謂嘅死硬派,今次我就選擇錯試(即係try an error).以我所知,bash會split object based on IFS,即係Input File Separator.於是我就寫左一個script如下:-

OLDIFS=${IFS}
IFS=\n
for line in `ls` ; do
echo "Line read is : ${line}"
done
IFS=${OLDIFS}

但係個output就唔太似樣:-

Line read is :-rw-r--r-- 1 root other 2797 Oct 21 2003 file1.txt -rw-r--r-- 1 root other 32797 Oct 22 2003 file2.txt ...

一睇返ls嘅result:-
ls
-rw-r--r-- 1 root other 2797 Oct 21 2003 file1.txt
-rw-r--r-- 1 root other 32797 Oct 22 2003 file2.txt

就知原來佢仲唔識睇\n,以為係"\"同"n"都係一個separator,之後當然試下用single quote, double quote, xx quote....去quote住個\n,但係result當然係一樣啦....真係比佢激死...玩足成日都無咩inspiration,於是就決定明日愁來明日當,立刻打道回府,照顧BB去也.今朝返到公司,突然就比我醒起,原來自己N個月前正好寫左個script,又係要line by line咁parse個file.所以都話,有時當你諗唔起點做嘅時候,最好都係唔好開OT,即刻返屋企hea下就反而會有新靈感.亦即係唔係比個死胡同困住,退一步,諗一諗,唔得嘅話就再停一停,先再諗一諗...哈哈...一睇之下,就發現原來自己太大意,其實只要睇下Advanced Bash Scripting Guide嘅Chapter 5 (Quoting),就會知道要OS真正了解\n=newline,就要用$加single quote...之後只係改左少少如下:-


OLDIFS=${IFS}
IFS=$'\n'
for line in `ls` ; do
echo "Line read is : ${line}"
done
IFS=${OLDIFS}

就成功左....真係有時最基本嘅嘢就最唔記得,比自己玩死..