2012-01-13 113 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] 

作品也在记事本++