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

Posted

技术标签:

【中文标题】如何使用 Perl 在文件中查找扩展的 ASCII 字符?【英文标题】:How can I find extended ASCII characters in a file using Perl? 【发布时间】:2010-10-27 06:50:56 【问题描述】:

谁能拿到剧本?

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

【问题讨论】:

【参考方案1】:

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

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

或者,unpack 和 chr 也可以使用。示例:

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

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


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

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

(感谢Yaakov Belch 提供$. 提示。)

【讨论】:

这是一种非常缓慢且无效的方法,请参阅 Dave Sherohman 的解决方案***.com/questions/881931/… 它更快更简单。 这个答案是在戴夫之前发布的。我见过 Dave 的方法,在大多数情况下它是首选。这只是表明我是 Perl 新手。我选择不删除这个答案,因为最后一部分似乎完全符合提问者的要求。另见***.com/questions/882122/… ...啊,该页面已被删除。可以这么说,问题表明应该为 each 扩展 ASCII 字符打印行号。这就是我的解决方案所做的。【参考方案2】:

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

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

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

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

【讨论】:

打印行号而不是行很容易:while() print "$.\n" if /[^ -~]/; 这应该可以解决上述问题 哎呀!我只是在阅读问题本身并错过了标题指定他想要行号。谢谢你的收获。【参考方案3】:

Oneliner:

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

对于旧的 perl 版本

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

【讨论】:

【参考方案4】:

一个关键的问题是

使用字节;

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

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

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

【讨论】:

【参考方案5】:

Hynek -Pichi- Vychodil 的回答:

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

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

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

改为。

【讨论】:

【参考方案6】:

grep 呢?

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

【讨论】:

以上是关于如何使用 Perl 在文件中查找扩展的 ASCII 字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中找到 Unicode 字符串的长度?

如何在perl中验证具有给定文件扩展名的多个文件

使用Preplot批量将ascii文件转为二进制文件

如何在 Perl 中修改 HTML 文件?

Perl程序将二进制转换为ascii

如何在 C 中使用扩展 ASCII 表的符号?