如何使用 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 字符?的主要内容,如果未能解决你的问题,请参考以下文章