(grep) Regex pour correspondre à des caractères non-ASCII?

Sous Linux, j’ai un répertoire avec beaucoup de fichiers. Certains d’entre eux ont des caractères non-ASCII, mais ils sont tous valides UTF-8 . Un programme a un bogue qui l’empêche de travailler avec des noms de fichiers non-ASCII, et je dois savoir combien sont affectés. J’allais faire cela avec find et ensuite faire un grep pour imprimer les caractères non-ASCII, puis faire un wc -l pour trouver le numéro. Il n’a pas besoin d’être grep; Je peux utiliser n’importe quelle expression régulière Unix standard, comme Perl , sed , AWK , etc.

Cependant, existe-t-il une expression régulière pour «tout caractère qui n’est pas un caractère ASCII»?

Cela correspondra à un seul caractère non-ASCII:

 [^\x00-\x7F] 

Ceci est un PCRE valide ( expression régulière compatible avec Perl ).

Vous pouvez également utiliser les raccourcis POSIX :

  • [[:ascii:]] – correspond à un seul caractère ASCII
  • [^[:ascii:]] – correspond à un seul caractère non-ASCII

[^[:print:]] vous suffira probablement. **

Non, [^\x20-\x7E] n’est pas ASCII.

C’est du vrai ASCII:

  [^\x00-\x7F] 

Sinon, il supprimera les nouvelles lignes et autres caractères spéciaux faisant partie du tableau ASCII!

Vous pouvez également consulter cette page: Expressions régulières Unicode , car elle contient des classes de caractères Unicode utiles, telles que:

  \ p {Contrôle}: un caractère de contrôle ASCII 0x00..0x1F ou Latin-1 0x80..0x9F. 

Vous n’avez pas vraiment besoin d’une regex.

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

Cela montrera aussi les noms de fichiers avec des caractères de contrôle, mais je considère cela comme une fonctionnalité.

Si vous ne disposez pas de fichiers correspondants, le glob ne produira plus rien.

[^\x00-\x7F] et [^[:ascii:]] manquent certains octets de contrôle, donc les chaînes peuvent parfois être la meilleure option. Par exemple cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g' cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g' fera des choses bizarres à votre terminal, où les ssortingngs test.torrent se comporteront.

Vous pouvez utiliser cette regex:

 [^\w \xC0-\xFF] 

Case demander, les options sont multilignes .

Cela s’est avéré très flexible et extensible. $ field = ~ s / [^ \ x00- \ x7F] // g; # ainsi tous les éléments non-ASCII ou spécifiques en question pourraient être nettoyés. Très bien dans la sélection ou le prétraitement des éléments qui deviendront éventuellement des clés de hachage.

Pour valider la zone de texte Accepter Ascii N’utilisez que ce motif

[\x00-\x7F]+