Comment puis-je trouver des caractères ASCII étendus dans un fichier en utilisant Perl?
-
22-08-2019 - |
Question
Comment puis-je trouver des caractères ASCII étendus dans un fichier en utilisant Perl? Quelqu'un peut-il obtenir le script?
..... merci à l'avance .....
La solution
Depuis les href="http://en.wikipedia.org/wiki/ASCII" étendues caractères ont une valeur 128 et plus , vous pouvez simplement appeler ord sur les caractères individuels et gérer ceux qui ont une valeur> = 128. Le code suivant sTDIN et imprime uniquement les caractères ASCII étendus:
while (<>) {
while (/(.)/g) {
print($1) if (ord($1) >= 128);
}
}
Vous pouvez également déballer avec chr sera également. Exemple:
while (<>) {
foreach (unpack("C*", $_)) {
print(chr($_)) if ($_ >= 128);
}
}
(je suis sûr que certains gourou Perl peut se condenser ces deux à deux one-liners ...)
Pour imprimer les numéros de ligne à la place, vous pouvez utiliser ce qui suit (cela ne supprime pas les doublons, et avoir un comportement bizarre quand unicode est passé):
while (<>) {
while (/(.)/g) {
print($. . "\n") if (ord($1) >= 128);
}
}
(Merci Yaakov Belch pour la pointe de $.
.)
Autres conseils
Le premier caractère ASCII imprimable est space
(32). Le dernier caractère ASCII imprimable est ~
(126). Donc, je serais probablement utiliser
while (<>) {
print "$.\n" if /[^ -~]/;
}
bien qu'il, il est vrai, affiche également des lignes contenant des caractères de contrôle ainsi que ASCII étendu.
Edit:. Changement d'imprimer le numéro de ligne plutôt que la ligne elle-même
Oneliner:
perl -nE'say$.if/[\xE0-\xFF]/'
pour les anciennes versions perl
perl -lne'print$.if/[\xE0-\xFF]/'
Une question cruciale est de savoir si le
octets d'utilisation;
pragma devrait être en vigueur. L'affiche doit décider. Pour choisir caractères avec des codes supérieurs à 127, ce qui suit suffira:
print grep 127 < ord, split // while <>;
ou
print grep /[^[:ascii:]]/, split // while <>;
Hynek -Pichi- Vychodil réponse:
perl -nE'say$.if/[\xE0-\xFF]/'
teste seulement une partie limitée de la non-impression devrait vraisemblablement être
perl -nE'say$.if/[\x80-\xFF]/'
au lieu.
Qu'en est-grep?
grep [\x00-\x1F\x7F-\xFF]+ *