Wie kann ich erweiterte ASCII -Zeichen in einer Datei mit Perl finden?
-
22-08-2019 - |
Frage
Wie kann ich erweiterte ASCII -Zeichen in einer Datei mit Perl finden? Kann jemand das Skript bekommen?
.....vielen Dank im Voraus.....
Lösung
Seit dem erweiterten ASCII Zeichen haben Wert 128 und höher, Sie können einfach anrufen ord Bei einzelnen Zeichen und verarbeiten Sie diejenigen mit einem Wert> = 128. Der folgende Code liest aus stdin und druckt nur die erweiterten ASCII -Zeichen aus:
while (<>) {
while (/(.)/g) {
print($1) if (ord($1) >= 128);
}
}
Alternative, auspacken zusammen mit Chr wird auch funktionieren. Beispiel:
while (<>) {
foreach (unpack("C*", $_)) {
print(chr($_)) if ($_ >= 128);
}
}
(Ich bin sicher
Um die Zeilennummern stattdessen zu drucken, können Sie Folgendes verwenden (dies entzieht keine Duplikate und hat ein seltsames Verhalten, wenn Unicode übergeben wird):
while (<>) {
while (/(.)/g) {
print($. . "\n") if (ord($1) >= 128);
}
}
(Vielen Dank Yaakov Belch für die $.
Tipp.)
Andere Tipps
Das erste druckbare ASCII -Zeichen ist space
(32). Das letzte druckbare ASCII -Zeichen ist ~
(126). Also würde ich wahrscheinlich benutzen
while (<>) {
print "$.\n" if /[^ -~]/;
}
Obwohl es zugegebenermaßen auch Zeilen mit Steuerzeichen sowie erweiterter ASCII enthalten wird.
Bearbeiten: Geändert, um die Zeilennummer und nicht die Zeile selbst zu drucken.
Einzeiler:
perl -nE'say$.if/[\xE0-\xFF]/'
Für ältere Perlversionen
perl -lne'print$.if/[\xE0-\xFF]/'
Eine entscheidende Frage ist, ob die
Bytes verwenden;
Pragma sollte in Kraft sein. Das Poster sollte das entscheiden. Zum Auspflanzen Figuren Mit Codes von mehr als 127 reicht das Folgende aus:
print grep 127 < ord, split // while <>;
oder
print grep /[^[:ascii:]]/, split // while <>;
HYNEK -PICHI -VYCHODIL -Antwort:
perl -nE'say$.if/[\xE0-\xFF]/'
Nur ein begrenzter Teil des nicht gedruckten Tests sollte vermutlich sein
perl -nE'say$.if/[\x80-\xFF]/'
stattdessen.
Was ist mit Grep?
grep [\x00-\x1F\x7F-\xFF]+ *