2012-01-13 144 views
13

我的電腦上的應用程序需要讀取文本文件。我有幾個,一個不工作;該程序沒有閱讀它,並告訴我,它有一個壞字符在某處。我的第一個猜測是,在那裏有一個非ASCII字符,但我不知道如何找到它。 Perl或任何通用的正則表達式都不錯。有任何想法嗎?搜索非ASCII文檔

+0

那你試試這麼遠嗎? – nmagerko 2012-01-13 02:59:52

+0

我相信你可以找到一個答案[這裏](http://stackoverflow.com/questions/881931/how-can-i-find-extended-ascii-characters-in-a-file-using-perl)? – Neilos 2012-01-13 03:11:36

+1

我接受了數學咖啡,因爲它超強 - 在記事本++中工作 – 2012-01-13 19:24:19

回答

12

您可以使用[^\x20-\x7E]來匹配非ASCII字符。

例如grep -P '[^\x20-\x7E]' suspicious_file

+2

我有一個使用它的問題,因爲它也會識別我的文件中所有行尾字符。將你的答案與Ruakh的結合起來雖然像一個魅力工作: [^ \ t \ n \ r \ x20- \ x7E] – JMM 2013-11-07 15:57:18

+0

在我的情況下,[其他問題的答案](http://stackoverflow.com/a/ 882437/873282)更好:'[\ xE0- \ xFF]' – koppor 2016-01-02 13:50:26

4
perl -wne 'printf "byte %02X in line $.\n", ord $& while s/[^\t\n\x20-\x7E]//;' 

會發現每一個字符不是一個ASCII字符glyphic,製表符,空格,或換行。

如果它在O.K.的文件中報告0D s(回車),則將\t\n更改爲\t\n\r

如果它只報告0D在壞的文件中,那麼您可以通過在它們上運行dos2unix來修復這些文件。

+0

只是附錄,應該將輸入作爲最終未列出的參數。 – 2014-02-19 22:03:34

+0

就像那樣,謝謝!我不得不在DOS控制檯上稍微改變它: 'perl -wne「printf qq(字節%02X在$。\ n中),ord $&while s/[^ \ t \ n \ x20- \ x7E]//;」 rplantiko 2014-05-19 12:16:36

2

如果您在源代碼中使用製表爲好,試試這個模式:

[^\x08-\x7E] 

作品也在記事本++