¿Cómo puedo encontrar caracteres ASCII extendidos en un archivo usando Perl?
-
22-08-2019 - |
Pregunta
¿Cómo puedo encontrar caracteres ASCII extendidos en un archivo usando Perl? ¿Alguien puede conseguir la escritura?
..... gracias de antemano .....
Solución
Desde las href="http://en.wikipedia.org/wiki/ASCII" caracteres tienen un valor 128 y superior , sólo puede llamar a ord en los personajes individuales y manejar aquellos con un valor> = 128. El siguiente código lee de la entrada estándar e imprime sólo los caracteres ASCII extendidos:
while (<>) {
while (/(.)/g) {
print($1) if (ord($1) >= 128);
}
}
Alternativamente, de desempaquetado junto con chr también funcionará. Ejemplo:
while (<>) {
foreach (unpack("C*", $_)) {
print(chr($_)) if ($_ >= 128);
}
}
(estoy seguro que algún gurú Perl puede condensarse ambos a dos de una sola línea ...)
Para imprimir los números de línea en su lugar, puede utilizar el siguiente (esto no eliminar duplicados, y tendrá un comportamiento extraño cuando se pasa Unicode):
while (<>) {
while (/(.)/g) {
print($. . "\n") if (ord($1) >= 128);
}
}
(Gracias Yaakov eructo por la punta $.
.)
Otros consejos
El primer carácter ASCII imprimible es space
(32). El último carácter ASCII imprimible es ~
(126). Así que probablemente me utilizo
while (<>) {
print "$.\n" if /[^ -~]/;
}
aunque será, ciertamente, también mostrar las líneas que contienen caracteres de control, así como ASCII extendido.
Editar:. ha cambiado para imprimir el número de línea en lugar de la propia línea
Oneliner:
perl -nE'say$.if/[\xE0-\xFF]/'
para versiones anteriores de Perl
perl -lne'print$.if/[\xE0-\xFF]/'
Una cuestión crucial es si el
Utilice bytes;
Pragma debe estar vigente. El cartel debe decidir eso. Para recoger caracteres con los códigos superiores a 127, lo siguiente será suficiente:
print grep 127 < ord, split // while <>;
o
print grep /[^[:ascii:]]/, split // while <>;
Hynek -Pichi- de Vychodil:
perl -nE'say$.if/[\xE0-\xFF]/'
Sólo las pruebas una parte limitada de la no impresión presumiblemente debe ser
perl -nE'say$.if/[\x80-\xFF]/'
en su lugar.
¿Qué hay de grep?
grep [\x00-\x1F\x7F-\xFF]+ *