(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]+
и это, кажется, работает нормально.