Grep regex не работает с Cygwin в Windows - PullRequest
3 голосов
/ 31 августа 2011

Я пытаюсь найти все символы не ascii в файле, используя grep:

grep '[^\x00-\x7F]' myfile

Я думаю, что это должно работать, но он возвращает каждую строку в файле.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

grep не распознает синтаксис \x.

( echo Hello ; echo '\\x48' ) | grep '\x48'

печать

\x48

('H' - это символ 0x48.)

Ваш grep соответствует всем строкам, поскольку каждая строка содержит символы, отличные от \, x, 0, 7, F и все, что находится в диапазоне 0 .. \.

Обратите внимание, что это не относится к Cygwin.

GNU grep (то, что есть у Cygwin) имеет экспериментальную опцию -P, которая говорит ему использовать Perl-подобные регулярные выражения; с этой опцией он распознает синтаксис \x.

1 голос
/ 31 августа 2011

Обнаружено, что perl работает:

perl -n -e 'print if / [^ \ x00- \ x7F] /' file

1 голос
/ 31 августа 2011

Grep может интерпретировать многобайтовые (т.е. не ASCII) символы как несколько однобайтовых (ASCII) символов.(Таким образом, этот прекрасный символ [U + 2229] будет отображаться как " [U + 0022], за которым следует ) [U + 0029].) Вам необходимо выяснить кодировку файлаи использовать более сложную систему, которая знает Unicode.

...