Как найти расширенные символы ASCII в файле с помощью Perl? - PullRequest
5 голосов
/ 19 мая 2009

Как я могу найти расширенные символы ASCII в файле, используя Perl? Кто-нибудь может получить сценарий?

..... заранее спасибо .....

Ответы [ 6 ]

10 голосов
/ 19 мая 2009

Поскольку расширенные ASCII символы имеют значение 128 и выше , вы можете просто вызвать ord для отдельных символов и обработать их со значением> = 128. Следующий код читает из стандартного ввода и печатает только расширенные символы ASCII:

while (<>) {
  while (/(.)/g) {
    print($1) if (ord($1) >= 128);
  }
}

В качестве альтернативы, распаковать вместе с chr также будет работать. Пример:

while (<>) {
  foreach (unpack("C*", $_)) {
    print(chr($_)) if ($_ >= 128);
  }
}

(Я уверен, что некоторые Perl-гуру могут сжать их до двух однострочных ...)


Чтобы напечатать номера строк вместо этого, вы можете использовать следующее (это не удаляет дубликаты и будет иметь странное поведение при передаче юникода):

while (<>) {
  while (/(.)/g) {
    print($. . "\n") if (ord($1) >= 128);
  }
}

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

7 голосов
/ 19 мая 2009

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

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

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

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

5 голосов
/ 19 мая 2009

Oneliner:

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

для старых версий Perl

perl -lne'print$.if/[\xE0-\xFF]/'
2 голосов
/ 19 мая 2009

Важнейшим вопросом является ли

использовать байты;

Прагма должна быть в силе. Постер должен решить это. Для выбора символов с кодами больше 127 достаточно следующего:

print grep 127 < ord, split // while <>;

или

print grep /[^[:ascii:]]/, split // while <>;
1 голос
/ 09 января 2010

Как насчет grep?

grep [\x00-\x1F\x7F-\xFF]+ *
1 голос
/ 24 июня 2009

Гинек-Пичи- Ответ Виходила:

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

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

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

вместо.

...