Поиск символов, отличных от ASCII, прост: установите языковой стандарт, в котором допустимы только символы ASCII, выполните поиск недопустимых символов.
LC_CTYPE=C grep '[^[:print:]]' myfile
Если вы хотите найти японские иероглифы, это немного сложнее. С помощью grep вам необходимо убедиться, что ваш языковой стандарт LC_CTYPE
соответствует кодировке файлов. Вам также необходимо убедиться, что для параметра LC_COLLATE
задан японский язык, если вы хотите использовать выражение диапазона символов. Например, в Linux (я определил первый и последний символ, который считается японским, просмотрев раздел LC_COLLATE
/ usr / share / i18n / locales / ja_JP
):
LC_CTYPE=ja_JP.UTF-8 LC_COLLATE=ja_JP.UTF-8 egrep '[。-龥]' myfile
или если вы хотите придерживаться ASCII в своем скрипте
LC_CTYPE=ja_JP.UTF-8 LC_COLLATE=ja_JP.UTF-8 egrep $'[\uff61-\u9fa5]' myfile
Сюда входят несколько знаков препинания, которые также используются в английском языке, например ⓒ
и ×
.
Perl имеет встроенные функции для классификации символов. Вы можете использовать класс символов \ p
для сопоставления символов на основе свойств Unicode . Передайте ключ командной строки -CSD
, чтобы сообщить Perl, что все находится в Unicode с кодировкой UTF-8.
perl -CSD -ne 'print if /\p{Hiragana}|\p{Katakana}/' myfile
Если ваши файлы не закодированы в UTF-8, вам придется явно вызвать binmode
, чтобы сообщить Perl об их кодировке. Для меня это слишком сложное использование perllocale .В качестве альтернативы вы можете сначала перекодировать строку в UTF-8 .
В качестве альтернативы в Perl вы можете использовать диапазоны числовых символов. Например, для поиска символов в блоках Unicode хирагана и катакана:
perl -CSD -ne 'print if /[\x{3040}-\x{30ff}]/' a