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 .....

Était-ce utile?

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 <>;
de

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]+ *
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top