Grepping para caracteres não-ASCII é fácil: defina uma localidade onde apenas caracteres ASCII sejam válidos, procure por caracteres inválidos.
LC_CTYPE=C grep '[^[:print:]]' myfile
Se você quiser procurar por caracteres japoneses, é um pouco mais complicado. Com o grep, você precisará garantir que sua configuração LC_CTYPE
locale corresponda à codificação dos arquivos. Você também precisará garantir que sua configuração LC_COLLATE
esteja configurada para japonês se você quiser usar uma expressão de intervalo de caracteres. Por exemplo, no Linux (determinei o primeiro e último caractere que é considerado japonês, observando a LC_COLLATE
section /usr/share/i18n/locales/ja_JP
):
LC_CTYPE=ja_JP.UTF-8 LC_COLLATE=ja_JP.UTF-8 egrep '[。-龥]' myfile
ou se você quiser manter o ASCII no seu script
LC_CTYPE=ja_JP.UTF-8 LC_COLLATE=ja_JP.UTF-8 egrep $'[\uff61-\u9fa5]' myfile
Isso inclui alguns caracteres de pontuação que também são usados em inglês, como ⓒ
e ×
.
O Perl possui recursos internos para classificar caracteres. Você pode usar a classe de caracteres \p
para corresponder caracteres baseados em Propriedades do Unicode . Passe o comutador da linha de comando -CSD
para informar ao Perl que tudo está em Unicode com a codificação UTF-8.
perl -CSD -ne 'print if /\p{Hiragana}|\p{Katakana}/' myfile
Se seus arquivos não estiverem codificados em UTF-8, você precisará ligar para binmode
explicitamente para informar Perl sobre sua codificação. Isso é um uso muito avançado de perllocale para mim. Alternativamente, você pode primeiro recodificar a linha em UTF-8 .
Como alternativa, em Perl, você pode usar intervalos de caracteres numéricos. Por exemplo, para procurar caracteres nos blocos Hiragana e Katakana Unicode:
perl -CSD -ne 'print if /[\x{3040}-\x{30ff}]/' a