7

如何使用 Perl 在文件中查找扩展的 ASCII 字符?谁能拿到剧本?

.....提前致谢.....

4

6 回答 6

10

由于扩展的ASCII字符具有128 或更高的值,因此您可以对单个字符调用ord并处理值 >= 128 的字符。以下代码从标准输入读取并仅打印扩展的 ASCII 字符:

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

或者,与chr一起unpack也可以。例子:

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

(我确信一些 Perl 大师可以将这两个都浓缩为两个单行...)


要改为打印行号,您可以使用以下内容(这不会删除重复项,并且在传递 unicode 时会有奇怪的行为):

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

(感谢Yaakov Belch$.提示。)

于 2009-05-19T10:32:28.350 回答
8

第一个可打印的 ASCII 字符是space(32)。最后一个可打印的 ASCII 字符是~(126)。所以我可能会使用

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

诚然,它也会显示包含控制字符和扩展 ASCII 的行。

编辑:更改为打印行号而不是行本身。

于 2009-05-19T11:04:53.337 回答
5

单线:

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

对于旧的 perl 版本

perl -lne'print$.if/[\xE0-\xFF]/'
于 2009-05-19T12:27:17.947 回答
2

一个关键的问题是是否

使用字节;

pragma 应该生效。海报应该决定这一点。对于选择代码大于 127 的字符,以下内容就足够了:

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

或者

print grep /[^[:ascii:]]/, split // while <>;
于 2009-05-19T12:38:47.890 回答
2

Hynek -Pichi- Vychodil 的回答:

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

只测试非印刷的有限部分大概应该是

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

反而。

于 2009-06-24T14:41:49.023 回答
1

grep 呢?

grep [\x00-\x1F\x7F-\xFF]+ *
于 2010-01-08T22:21:42.823 回答