如何使用Perl在文件中找到扩展的ASCII字符?

时间:2009-05-19 10:17:34

标签: perl parsing encoding extended-ascii

如何使用Perl在文件中找到扩展的ASCII字符?任何人都可以获得剧本吗?

.....提前感谢.....

6 个答案:

答案 0 :(得分:10)

由于扩展的ASCII字符的值为128 and higher,因此您只需在单个字符上调用ord并处理值> gt = 128的字符。以下代码从stdin读取仅打印扩展的ASCII字符:

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

或者,unpackchr也可以使用。例如:

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

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


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

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

(感谢$.提示{{1}}。

答案 1 :(得分:7)

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

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

虽然它确实会显示包含控制字符和扩展ASCII的行。

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

答案 2 :(得分:5)

Oneliner:

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

用于较旧的perl版本

perl -lne'print$.if/[\xE0-\xFF]/'

答案 3 :(得分:2)

一个关键问题是

使用字节;

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

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

print grep /[^[:ascii:]]/, split // while <>;

答案 4 :(得分:1)

Hynek -Pichi- Vychodil的回答:

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

只测试非打印的有限部分应该是

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

代替。

答案 5 :(得分:1)

grep怎么样?

grep [\x00-\x1F\x7F-\xFF]+ *