2012-01-13 6 views
13

Приложение на моем компьютере необходимо прочитать в текстовом файле. У меня их несколько, и один не работает; программа не читает ее и говорит мне, что в ней где-то есть плохой символ. Прежде всего я предполагаю, что там где-то есть символ не-ascii, но я не знаю, как его найти. Perl или любое общее регулярное выражение было бы неплохо. Есть идеи?Поиск документа для не-ascii

+0

Что вы пытаетесь до сих пор? – nmagerko

+0

Я считаю, что вы можете найти ответ [здесь] (http://stackoverflow.com/questions/881931/how-can-i-find-extended-ascii-characters-in-a-file-using-perl)? – Neilos

+1

Я принял математический кофе, потому что он был сверхзадачи - работал в Notepad ++ –

ответ

12

Вы можете использовать [^\x20-\x7E] в соответствии с символом, отличным от ASCII.

например. grep -P '[^\x20-\x7E]' suspicious_file

+2

У меня возникла проблема с этим, так как он также идентифицировал бы все символы конца строки в моем файле. Объединив ваш ответ с Руахом, хотя он работал как шарм: [^ \ t \ n \ r \ x20- \ x7E] – JMM

+0

В моем случае [ответ на другой вопрос] (http://stackoverflow.com/a/ 882437/873282) было лучше: '[\ xE0- \ xFF]' – koppor

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

найдет каждый символ, который не является ASCII Покрытый письменами символ, табуляция, пробел или символ новой строки.

Если он сообщает 0D s (возврат каретки) в файлах, которые являются O.K., а затем измените \t\n на \t\n\r.

Если это только сообщения 0D s в файлах, которые являются плохими, то вы можете исправить эти файлы, запустив на них dos2unix.

+0

Просто добавление, нужно запустить ввод как окончательный неперечисленный аргумент. –

+0

Нравится, спасибо! Мне пришлось немного изменить его для консоли DOS: 'perl -wne 'printf qq (byte% 02X в строке $. \ N), ord $ & while s/[^ \ t \ n \ x20- \ x7E]//;» rplantiko

2

Если вы используете табуляторы в исходном коде, а, попробуйте этот шаблон:

[^\x08-\x7E] 

также работает в Notepad ++

Смежные вопросы