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 UTF-8 valides . Un programme a un bogue qui l'empêche de fonctionner avec des noms de fichiers non ASCII, et je dois savoir combien sont affectés. J'allais faire cela avec find
, puis faire un grep pour imprimer les caractères non ASCII, puis faire un wc -l
pour trouver le nombre. Il n'est pas nécessaire que ce soit 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»?
/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]
Réponses:
Cela correspondra à un seul caractère non ASCII:
Il s'agit d'un PCRE ( Expression régulière compatible Perl) valide .
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. **la source
^
est valide dans PCRE.:print:
ne fonctionnera pas dans un terminal UTF8? Cela fonctionne pour moi dans le levier dans un terminal UTF8:27.chr =~ /[^[:print:]]/
rename 's/[^\x00-\x7F]//g' *
(vous pouvez utiliser-n
pour vérifier que les renommages sont corrects en premier).Non, ce
[^\x20-\x7E]
n'est pas ASCII.C'est du vrai ASCII:
Sinon, il supprimera les nouvelles lignes et autres caractères spéciaux qui font partie de la table ASCII!
la source
Vous pouvez également consulter cette page: Expressions régulières Unicode , car elle contient des classes de caractères Unicode utiles, comme:
la source
[^\x00-\x7F]
et[^[:ascii:]]
manquez quelques octets de contrôle afin que les chaînes soient parfois la meilleure option. Par exemple,cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g'
fera des choses bizarres sur votre terminal, où commestrings test.torrent
se comportera.la source
Pour valider la zone de texte Accepter Ascii, utilisez uniquement ce modèle
[\x00-\x7F]+
la source
J'utilise
[^\t\r\n\x20-\x7E]+
et cela semble bien fonctionner.la source
Vous pouvez utiliser cette regex:
Cas demandez, les options sont Multiline .
la source
Vous n'avez pas vraiment besoin d'une expression régulière.
Cela affichera également 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 aucun fichier correspondant, le glob se développera uniquement sur lui-même, sauf si vous avez
nullglob
défini. (L'expression ne correspond pas à elle-même, donc techniquement, cette sortie est sans ambiguïté.)la source
Cela s'est avéré être très flexible et extensible. $ champ = ~ s / [^ \ x00- \ x7F] // g; # ainsi tous les éléments non ASCII ou spécifiques en question pourraient être nettoyés. Très agréable que ce soit dans la sélection ou le prétraitement des éléments qui finiront par devenir des clés de hachage.
la source