Посмотрите на колеса питона, чтобы решить вашу проблему . Лучшая часть колес Python - это то, что они позволяют устанавливать расширения C без компиляторов. Я только что установил numpy и scipy с помощью pip в чистой установке python, и они оба работали нормально.
Поскольку расширенные символы ASCII имеют значение 128 и выше , вы можете просто вызвать ord для отдельных символов и обработать их со значением> = 128. Следующий код читает из stdin и печатает только расширенные символы ASCII:
while (<>) {
while (/(.)/g) {
print($1) if (ord($1) >= 128);
}
}
В качестве альтернативы, unpack вместе с chr также будет работать. Пример:
while (<>) {
foreach (unpack("C*", $_)) {
print(chr($_)) if ($_ >= 128);
}
}
(я уверен, что какой-нибудь гуру Perl может сжать оба эти слова до двух однострочных ...)
Чтобы вместо этого напечатать номера строк, вы можете использовать следующее (это не удаляет дубликаты и будет вести себя странно при передаче юникода):
while (<>) {
while (/(.)/g) {
print($. . "\n") if (ord($1) >= 128);
}
}
(Спасибо Яакову Белчу за совет $.
.)
Первый печатаемый символ ASCII - это пробел
(32). Последний печатаемый символ ASCII - это ~
(126). Так что я бы, вероятно, использовал
while (<>) {
print "$.\n" if /[^ -~]/;
}
, хотя он, по общему признанию, также будет отображать строки, содержащие управляющие символы, а также расширенный ASCII.
Изменить: Изменено для печати номера строки, а не самой строки.
Oneliner:
perl -nE'say$.if/[\xE0-\xFF]/'
for older perl versions
perl -lne'print$.if/[\xE0-\xFF]/'
A crucial question is whether the
use bytes;
pragma should be in effect. The poster should decide that. For picking characters with codes greater than 127, the following will suffice:
print grep 127 < ord, split // while <>;
or
print grep /[^[:ascii:]]/, split // while <>;
Hynek -Pichi- Ответ Vychodil:
perl -nE'say$.if/[\xE0-\xFF]/'
только тестирует ограниченную часть непечатаемой части, предположительно, вместо
perl -nE'say$.if/[\x80-\xFF]/'
.
] А как же grep? [
][
grep [\x00-\x1F\x7F-\xFF]+ *
]