(grep) Regex для соответствия символам, отличным от ASCII?

В Linux у меня есть каталог с большим количеством файлов. Некоторые из них имеют символы, отличные от ASCII, но все они действительны UTF-8. У одной программы есть ошибка, которая предотвращает ее работу с именами, отличными от ASCII, и я должен выяснить, сколько из них затронуто. Я собирался сделать это с помощью find, а затем сделать grep для печати символов, отличных от ASCII, а затем сделать wc -l, чтобы найти номер. Это не должно быть grep; Я могу использовать любое стандартное Unix регулярное выражение, например Perl, sed, AWK и т.д.

Однако существует ли регулярное выражение для "любого символа, который не является символом ASCII"?

Ответ 1

Это будет соответствовать одному символу, отличному от ASCII:

[^\x00-\x7F]

Это действительный PCRE (регулярное выражение, совместимое с Perl).

Вы также можете использовать сокращения POSIX:

  • [[:ascii:]] - соответствует одному ASCII char
  • [^[:ascii:]] - соответствует одному не-ASCII char

[^[:print:]], вероятно, будет достаточно для вас. **

Ответ 2

Нет, [^\x20-\x7E] не является ASCII.

Это реальный ASCII:

 [^\x00-\x7F]

В противном случае он будет обрезать символы новой строки и другие специальные символы, которые являются частью таблицы ASCII!

Ответ 3

Вы также можете проверить эту страницу: Регулярные выражения Unicode, так как она содержит некоторые полезные классы символов Unicode, такие как:

\p{Control}: an ASCII 0x00..0x1F or Latin-1 0x80..0x9F control character.

Ответ 4

Вам не нужно регулярное выражение.

printf "%s\n" *[!\ -~]*

Это также покажет имена файлов с управляющими символами в их именах, но я считаю, что это особенность.

Если у вас нет подходящих файлов, глобус расширится до самого себя, если у вас не установлен nullglob. (Выражение не соответствует самому себе, поэтому технически этот вывод однозначен.)

Ответ 5

[^\x00-\x7F] и [^[:ascii:]] пропустить некоторые контрольные байты, поэтому strings может быть лучшим вариантом. Например, cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g' будет делать нечетные вещи на вашем терминале, где будет вести себя strings test.torrent.

Ответ 6

Вы можете использовать это регулярное выражение:

[^\w \xC0-\xFF]

Задайте вопрос, параметры Многострочный.

Ответ 7

Это оказалось очень гибким и расширяемым. $ field = ~ s/[^\x00-\x7F]//g; # Таким образом, все не относящиеся к ASCII или определенные элементы могут быть очищены. Очень приятно либо в выборе или предварительной обработке элементов, которые в конечном итоге станут хеш-ключами.

Ответ 8

Подтвердить текстовое поле Принять Ascii Используйте только этот шаблон

[\x00-\x7F]+

Ответ 9

Я использую [^\t\r\n\x20-\x7E]+ и это, кажется, работает нормально.