2010年11月1日 星期一

shell script 中擷取子字串

轉自 http://dotnetmis91.blogspot.com/2010/02/shell-script.html

今天要分享的是,在 shell script 中擷取子字串 (俗稱 substring) 的技巧 (各程式語言都要提供的最基本功能)。

一開始在學 shell script 的時候,我看的是臥龍小三的網站 (News 裡面的 Shell 入門),按照順序看過一遍固然收穫很多,但也僅止於「快速入門」的程度,也就是「讓你不要害怕 shell script」的作用,其中對字串處理這種重要的功能並沒有整理的很詳細,因此我一開始連「取出某個字串的最後一個字元」這樣的功能都不知道如何下手,用 sed  awk 都不太對。後來透過孤狗大神找到了幾種方法:

法一:Bash Shell Programming in Linux (搜尋 substring)

time=”20:06:16” 
unit=${time:${#time}-1:${#time}} –> $time變數要寫三次!
這個寫法顯然相當之囉嗦,但是它是有效的。

法二:parsing a string in a shell script (透過 awk 來做)

time=”20:06:16” 
unit=`echo $time | awk '{print substr($0, length($0), length($0))}'` –> 可用 $0 取代 $time,較簡潔


但整體看來還是非常囉嗦,我只是要取出一個字串的最後一個字元而已阿!

法三:臥龍小三-Linux Shell 程式設計實務 (Chapter 08: 8-4 使用外部程式 expr 做算數運算)

time=”20:06:16” 
startPos=$(expr length $time) 
unit=`expr substr $time $startPos 1` -> 注意 $time 要被包在“ “裡面


這章介紹的 expr 功能還蠻多的,有找子字串 index 和做 substring 等等功能,值得練習一下。這個作法雖然少了很多小括號,但感覺還是挺麻煩的,最後,終於讓我找到一個最簡單直覺的作法:

法四:一樣出自 parsing a string in a shell script (看這個留言)

time=”20:06:16” 
unit=`echo $time | tail -c 2
–> 重點在 -c 這個參數,以及用 tail 的話 byte 數要多 +1 (取最後1個字元:2)

tail-c 

一行搞定!而且非常的直覺!除了要取出特定字串以外,如果是要正取 (用 head)或倒取 (用 tail) 固定幾個字元的話,應該都會用 head/tail 來做吧!

以上就是今天的分享,如有更好的作法還請不吝賜教 ^^~

PS. 取出字串的最後一個字元,在 Perl 中也非常簡單:substr $time, -1,負號代表由字尾開始往前面取

沒有留言:

張貼留言