Come posso trovare I caratteri ASCII estesi in un file utilizzando Perl?
-
22-08-2019 - |
Domanda
Come posso trovare I caratteri ASCII estesi in un file utilizzando Perl?Chiunque può ottenere lo script?
.....grazie in anticipo.....
Soluzione
Dal momento che le caratteri hanno un valore 128 e superiori , si può chiamare ord sui singoli personaggi e gestire quelli con un valore> = 128. Il seguente codice legge da standard input e stampa solo i caratteri ASCII estesi:
while (<>) {
while (/(.)/g) {
print($1) if (ord($1) >= 128);
}
}
In alternativa, unpack insieme con chr funziona anche. Esempio:
while (<>) {
foreach (unpack("C*", $_)) {
print(chr($_)) if ($_ >= 128);
}
}
(Sono sicuro che alcuni Perl guru può condensare entrambe queste due battute ...)
Per stampare i numeri di riga, invece, è possibile utilizzare il seguente (questo non rimuovere i duplicati, ed avrà un comportamento strano quando viene passata unicode):
while (<>) {
while (/(.)/g) {
print($. . "\n") if (ord($1) >= 128);
}
}
( Yaakov Belch per la punta $.
.)
Altri suggerimenti
Il primo carattere ASCII stampabile è space
(32). L'ultimo carattere ASCII stampabile è ~
(126). Quindi probabilmente sarei uso
while (<>) {
print "$.\n" if /[^ -~]/;
}
anche se sarà, certamente, visualizzare anche linee contenenti caratteri di controllo e ASCII esteso.
Modifica:. Cambiato per stampare il numero di riga piuttosto che la linea stessa
Oneliner:
perl -nE'say$.if/[\xE0-\xFF]/'
per le versioni più vecchie di perl
perl -lne'print$.if/[\xE0-\xFF]/'
Una domanda cruciale è se la
uso bytes;
Pragma dovrebbe essere a tutti gli effetti. Il poster deve decidere che. Per scegliere caratteri con codici superiori a 127, il seguente sarà sufficiente:
print grep 127 < ord, split // while <>;
o
print grep /[^[:ascii:]]/, split // while <>;
Hynek -Pichi - Vychodil risposta:
perl -nE'say$.if/[\xE0-\xFF]/'
i test solo una parte limitata di un non-la stampa dovrebbe presumibilmente essere
perl -nE'say$.if/[\x80-\xFF]/'
invece.
Che dire di grep?
grep [\x00-\x1F\x7F-\xFF]+ *