解決了一例awk中substr處理漢字字串的bug

lastwinner發表於2011-08-30
本來,awk中的substr在處理中文字串是沒有問題的,但是前幾天卻碰到一個詭異的現象:
————————————————————————————————
[lw]$cat awktest
Title: 123小苵大家
[lw]$cat awktest | awk -F" " '{print $2}'
123小苵大家
[lw]$cat awktest | awk -F" " '{print substr($2,1)}'
123小小|大家

————————————————————————————————
見鬼了不是?
最後採用其他方式解決了此問題:
————————————————————————————————
[lw]$export atstr=`cat awktest | awk -F" " '{print $2}'`
[lw]$echo ${atstr:0:10}
123小苵大家
[lw]$cat awktest | awk -F" " '{print $2}' | cut -c 1-
123小苵大家
[lw]$cat awktest | cut -c 8-
123小苵大家

————————————————————————————————

其實最不解的還是
————————————————————————————————
[lw]$expr substr "`cat awktest`" 8 18
123小苵大家
————————————————————————————————

敢情這倆substr不是一個娘親生的。

對了,彙報下自家的環境
————————————————————————————————
[lw]$ uname -a
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
[lw]$ locale
LANG=zh_CN
LC_CTYPE="zh_CN"
LC_NUMERIC="zh_CN"
LC_TIME="zh_CN"
LC_COLLATE="zh_CN"
LC_MONETARY="zh_CN"
LC_MESSAGES="zh_CN"
LC_PAPER="zh_CN"
LC_NAME="zh_CN"
LC_ADDRESS="zh_CN"
LC_TELEPHONE="zh_CN"
LC_MEASUREMENT="zh_CN"
LC_IDENTIFICATION="zh_CN"
LC_ALL=

——————————————————————————————————
最終大概明確了問題的所在:awk中的substr,對於LANG設為zh_CN時,實際上是呼叫的zh_CN.gb2312,而awk的print、expr、cut等,調的是zh_CN.gbk。
當明確設定LANG為zh_CN.gbk時,以上各類輸出都表現正常。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29867/viewspace-706228/,如需轉載,請註明出處,否則將追究法律責任。

相關文章