Как я могу найти расширенные символы ASCII в файле с помощью Perl?

Посмотрите на колеса питона, чтобы решить вашу проблему . Лучшая часть колес Python - это то, что они позволяют устанавливать расширения C без компиляторов. Я только что установил numpy и scipy с помощью pip в чистой установке python, и они оба работали нормально.

5
задан brian d foy 26 May 2009 в 15:35
поделиться

6 ответов

Поскольку расширенные символы 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);
  }
}

(Спасибо Яакову Белчу за совет $. .)

10
ответ дан 18 December 2019 в 06:12
поделиться

Первый печатаемый символ ASCII - это пробел (32). Последний печатаемый символ ASCII - это ~ (126). Так что я бы, вероятно, использовал

while (<>) {
  print "$.\n" if /[^ -~]/;
}

, хотя он, по общему признанию, также будет отображать строки, содержащие управляющие символы, а также расширенный ASCII.

Изменить: Изменено для печати номера строки, а не самой строки.

7
ответ дан 18 December 2019 в 06:12
поделиться

Oneliner:

perl -nE'say$.if/[\xE0-\xFF]/'

for older perl versions

perl -lne'print$.if/[\xE0-\xFF]/'
5
ответ дан 18 December 2019 в 06:12
поделиться

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 <>;
2
ответ дан 18 December 2019 в 06:12
поделиться

Hynek -Pichi- Ответ Vychodil:

perl -nE'say$.if/[\xE0-\xFF]/'

только тестирует ограниченную часть непечатаемой части, предположительно, вместо

perl -nE'say$.if/[\x80-\xFF]/'

.

1
ответ дан 18 December 2019 в 06:12
поделиться
[

] А как же grep? [
][

] [
grep [\x00-\x1F\x7F-\xFF]+ *
]
1
ответ дан 18 December 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: