今天遇到一個在linux環境下的文件編碼問題,搞了好久才搞明白。
先說說背景:
有一個這樣的文件,文件test.txt內容如下:
abcdefghijklmnopqrst
hfjkdafldsfkfjkaddjfka
然后我想過濾出以a開頭的文件內容,命令如下:
cat test.txt|egrep '^a'
一看這命令沒啥毛病,是可以過濾出第一行的內容來。然而,過濾結果卻沒有出現我預期的效果。不能夠啊,這命令我用了N多年了,難道我記錯了???於是乎我各種百度,各種嘗試,把命令換成如下:
egrep '^a' test.txt
結果呢,呵呵。一樣不管用啊。what the ***!百思不得其解啊。接着又是各種嘗試。
echo abcdefghijklmnopqrst | egrep '^a'
哎呦喂,這樣就可以過濾出來了,耍我呢。
再接着試:
echo abcdefghijklmnopqrst > test2.txt
cat test2.txt | egrep '^a'
你猜結果怎么樣,這就沒問題了!!!證明過濾命令是沒有錯的。
那是什么原因??一樣的命令,卻出現不一樣的結果。說到這里,想你也能猜到了吧,文件編碼不一樣導致的結果!!
來讓我們看看這個文件編碼是什么樣子的。
$ file test.txt
test.txt: UTF-8 Unicode (with BOM) text, with CRLF line terminators
$ file test2.txt
test2.txt: ASCII text
$ enca test.txt
Universal transformation format 8 bits; UTF-8
CRLF line terminators
$ enca test2.txt
7bit ASCII characters
看看,表面看着一樣的內容,實際上連長度都不一樣。在ASCII編碼格式中是a開頭,在UTF-8格式中卻不是a開頭了,盡管你的肉眼看到的是以a開頭。哎,坑。折騰了我好幾個小時。
記錄一下,以后再碰見這樣的問題也知道是怎么回事了,也給在踩一樣坑的小伙伴們借鑒一下。