2009-05-19 68 views

回答

10

由于扩展ASCII字符具有价值128 and higher,你可以调用单个的字符ord和处理这些值> = 128以下代码从标准输入和只打印扩展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); 
    } 
} 

(谢谢Yaakov Belch$.尖端)

+0

这是非常缓慢的,无效的方法,请参阅戴夫Sherohman的解决方案http://stackoverflow.com/questions/881931/how-to-print-numbers-of-line-containing-extended-ascii-characters -in-perl/882113#882113它更快更简单。 – 2009-05-19 12:11:43

+0

此答案发布于Dave's之前。我见过戴夫的方法,在大多数情况下,这是首选。这只是表明我是一个Perl新手。我选择不删除这个答案,因为最后一部分似乎完全是提问者想要的。另请参阅http://stackoverflow.com/questions/882122/reading-a-file-char-by-char-and-checking-for-extented-ascii-char – Stephan202 2009-05-19 12:24:32

7

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

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

虽然它,无可否认,也会显示包含控制字符以及扩展ASCII的行。

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

5

Oneliner:

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

对老年人的perl版本

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

一个关键的问题是,是否

使用字节;

编译指示应该有效。海报应该决定。采摘字符有大于127码,以下就足够了:

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

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

希内克-Pichi- Vychodil的回答是:

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

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

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

改为。

1

grep怎么样?

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