web-dev-qa-db-fra.com

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

Sur 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 TF-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 le faire avec find puis faire un grep pour imprimer les caractères non-ASCII, puis faire un wc -l pour trouver le numéro. Il n'est pas nécessaire que ce soit grep; Je peux utiliser n'importe quel standard Unix expression régulière , comme Perl , sed , AWK , etc.

Cependant, existe-t-il une expression régulière pour "tout caractère qui n'est pas un ASCII)"?

151
Rory

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

[^\x00-\x7F]

Ceci est un [~ # ~] pcre [~ # ~] ( expression régulière compatible Perl ).

Vous pouvez également utiliser le raccourci [~ # ~] [~ # ~] :

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

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

269
Alix Axel

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

C'est du vrai ASCII:

 [^\x00-\x7F]

Sinon, les nouvelles lignes et les autres caractères spéciaux contenus dans la table ASCII!) Seront supprimés!

35
Peter L

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

\ p {Control}: an ASCII 0x00..0x1F ou caractère de contrôle Latin-1 0x80..0x9F.
5
Rubens Farias

[^\x00-\x7F] Et [^[:ascii:]] Manquent des octets de contrôle donc chaînes peut parfois être la meilleure option. Par exemple, cat test.torrent | Perl -pe 's/[^[:ascii:]]+/\n/g' Fera des choses étranges sur votre terminal, alors que strings test.torrent Se comportera.

3
user1133275

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 dans leurs noms, mais je considère que c'est une fonctionnalité.

Si vous n'avez pas de fichiers correspondants, le glob se développera à lui-même, à moins que vous n'ayez nullglob défini. (L'expression ne correspond pas à elle-même, donc techniquement, cette sortie est sans ambiguïté.)

2
tripleee

J'utilise [^\t\r\n\x20-\x7E]+ et cela semble bien fonctionner.

2
SolidSnakeUk89

Vous pouvez utiliser cette regex:

[^\w \xC0-\xFF]

Case ask, les options sont Multiline.

1
CypherPotato

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 peuvent être nettoyés. Très agréable soit dans la sélection ou le pré-traitement des éléments qui deviendront éventuellement des clés de hachage.

1
Don Turnblade

Pour valider une zone de texte, acceptez Ascii Utilisez uniquement ce modèle.

[\x00-\x7F]+

1
Othman Mahmoud