(grep) Regex для соответствия не-ASCII символам? - PullRequest
147 голосов
/ 23 января 2010

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

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

Ответы [ 9 ]

261 голосов
/ 23 января 2010

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

[^\x00-\x7F]

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

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

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

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

34 голосов
/ 19 ноября 2012

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

Это настоящий ASCII:

 [^\x00-\x7F]

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

5 голосов
/ 23 января 2010

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

\p{Control}: an ASCII 0x00..0x1F or Latin-1 0x80..0x9F control character.
3 голосов
/ 03 марта 2016

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

2 голосов
/ 21 января 2019

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

2 голосов
/ 28 мая 2012

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

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

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

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

1 голос
/ 30 мая 2018

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

[\x00-\x7F]+

1 голос
/ 19 октября 2015

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

1 голос
/ 23 марта 2015

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

[^\w \xC0-\xFF]

Дело спрашивать, варианты Многострочный .

...