解決了一例awk中substr處理漢字字串的bug
本來,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時,以上各類輸出都表現正常。
————————————————————————————————
[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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysqlconnect bug 處理一例。MySql
- Linux 中 awk指令 sub和substr的區別Linux
- 獲取字串中的所有漢字字串
- 正規表示式刪除字串中的漢字字串
- 處理一串字串的關鍵字字串
- Js中substr,substring,slice擷取字串的異同JS字串
- C++中的字串編碼處理C++字串編碼
- Oracle中REGEXP_SUBSTR函式(字串轉多行)Oracle函式字串
- 字串處理字串
- 對於數字或者字串有限的問題的處理字串
- MySQL 動態字串處理詳解MySql字串
- 如何使用awk處理文字內容
- SQL中的常用的字串處理函式大全SQL字串函式
- 處理生產bug
- 在Linux中,如何使用awk和sed進行文字處理?Linux
- 簡單的字串處理字串
- 字串擷取 slice,substr,substring 的區別字串
- awk取文字中兩個字串之間的部分字串
- JavaScript獲取字串的長度區分漢字JavaScript字串
- JavaScript常用的字串處理方法JavaScript字串
- Java 運算子詳解與字串處理技巧Java字串
- 萬字詳解AI開發中的資料預處理(清洗)AI
- Linux檔案處理三劍客之awkLinux
- [20190718]12c壞塊處理一例.txt
- TiDB DM同步報錯ErrCode 44006處理一例TiDB
- Python 漢字區位碼、字串 相互轉換Python字串
- 實用處理字串的linux命令字串Linux
- 處理stdin輸入的字串指令字串
- 處理字串的方法都在這裡字串
- 字串和日期時間的處理字串
- bug及異常處理1
- windows bat系列11:for處理案例四 去掉字串中的空格WindowsBAT字串
- Guava字串處理Joiner、SplitterGuava字串
- PHP 陣列 & 字串處理PHP陣列字串
- bat 批處理字串操作BAT字串
- shell字串處理總結字串
- Linux中awk命令詳解Linux
- PHP 實現字串翻轉(包含中文漢字)的實現PHP字串
- mysql 報錯json字串 中文漢字轉義的問題MySqlJSON字串