linux的文件編碼問題--為什么grep不到我想要的內容


今天遇到一個在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開頭。哎,坑。折騰了我好幾個小時。

記錄一下,以后再碰見這樣的問題也知道是怎么回事了,也給在踩一樣坑的小伙伴們借鑒一下。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM