2015-08-10 8 views
1

Мне нужна команда unix, чтобы проверить, что файл имеет только символы ASCII для печати (между ASCII Hex 20 и 7E включительно).Проверьте, содержит ли файл определенные символы ASCII

Я получил команду ниже, чтобы проверить, содержит ли файл не-ASCII-символы, но не может понять мой вышеупомянутый вопрос.

if LC_ALL=C grep -q '[^[:print:][:space:]]' file; then 
    echo "file contains non-ascii characters" 
else 
    echo "file contains ascii characters only" 
fi 

ответ

2

Приятно иметь: - Остановить загрузку результатов. Иногда один достаточно

Чтобы найти 20 для 7E символов в файле вы можете использовать:

grep -P "[\x20-\x7E]" file 

Обратите внимание на использовании -P для выполнения Perl регулярных выражений.

Но в этом случае вы хотите проверить, содержит ли файл только эти символы. Так что лучше всего сделать, это проверить, есть ли какие-либо из них, которые не являются в пределах этого диапазона, то есть проверить [^range]:

grep -P "[^\x20-\x7E]" file 

Все вместе, я бы сказал:

grep -qP "[^\x20-\x7E]" file && echo "weird ASCII" || echo "clean one" 
+0

Спасибо, что ответили, но я получил это как результат $ grep -qP "[^ \ x20- \ x7E]" au26026.txt && echo "weird ASCII" || echo "clean one" grep: незаконный вариант - P use: grep [-E | -F] [-c | -l | -q] [-bhinsvwx] -e pattern_list ... [-f pattern_file. ..] [файл ...] использование: grep [-E | -F] [-c | -l | -q] [-bhinsvwx] [-e pattern_list ...] -f pattern_file ... [ файл ...] использование: grep [-E | -F] [-c | -l | -q] [-bhinsvwx] pattern [file ...] clean one – austin

+0

Это потому, что вы используете старую ' grep'. На какой ОС вы работаете? Что вы получите, если вы скажете 'grep -version'? – fedorqui

+0

Я использую шпатлевку, выпуская 0.60. Это то, что я должен использовать в своей работе, ни один другой вариант для доступа к файлам сервера. Результатом, который я получаю из 'grep --version', является' $ grep --version grep: незаконный вариант - - использование: grep [-E | -F] [-c | -l | -q] [-bhinsvwx ] -e pattern_list ... [-f pattern_file ...] [file ...] use: grep [-E | -F] [-c | -l | -q] [-bhinsvwx] [-e pattern_list ...] -f pattern_file ... [файл ...] use: grep [-E | -F] [-c | -l | -q] [-bhinsvwx] pattern [file ...] ' – austin

0

Это может быть сделано в UNIX используя POSIX grep опции:

if LC_ALL=C grep -q '[^ -~]' file; then 
    echo "file contains non-ascii characters" 
else 
    echo "file contains ascii characters only" 
fi 

где персонажи в [ ... ] являются ^ (картон), пробел, - (знак ASCII минус), ~ (тильда).

Вы также можете указать вкладку ASCII. Стандарт относится к ним как collating elements. Похоже, что и \x (шестнадцатеричный), либо \0 (восьмеричный) показаны в стандартном описании bracket expressions (см. 7.4.1). Таким образом, вы можете использовать \x09 или \011 для литеральной вкладки.

В соответствии с описанием, по умолчанию -e принимает basic regular expression (BRE). Если вы добавили -E, у вас могло бы быть расширенное регулярное выражение (но это не нужно).

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