【发布时间】:2010-10-27 06:50:56
【问题描述】:
如何使用 Perl 在文件中查找扩展的 ASCII 字符?谁能拿到剧本?
......提前谢谢......
【问题讨论】:
标签: perl parsing encoding extended-ascii
如何使用 Perl 在文件中查找扩展的 ASCII 字符?谁能拿到剧本?
......提前谢谢......
【问题讨论】:
标签: perl parsing encoding extended-ascii
由于扩展的ASCII 字符具有128 and higher 的值,您只需对单个字符调用ord 并处理值>= 128 的字符。以下代码从标准输入读取并仅打印扩展的ASCII 字符:
while (<>) {
while (/(.)/g) {
print($1) if (ord($1) >= 128);
}
}
while (<>) {
foreach (unpack("C*", $_)) {
print(chr($_)) if ($_ >= 128);
}
}
(我确信一些 Perl 大师可以将这两个都浓缩为两个单行...)
要打印行号,您可以使用以下命令(这不会删除重复项,并且在传递 unicode 时会出现奇怪的行为):
while (<>) {
while (/(.)/g) {
print($. . "\n") if (ord($1) >= 128);
}
}
(感谢Yaakov Belch 提供$. 提示。)
【讨论】:
第一个可打印的 ASCII 字符是space (32)。最后一个可打印的 ASCII 字符是 ~ (126)。所以我可能会使用
while (<>) {
print "$.\n" if /[^ -~]/;
}
当然,它也会显示包含控制字符和扩展 ASCII 的行。
编辑:更改为打印行号而不是行本身。
【讨论】:
Oneliner:
perl -nE'say$.if/[\xE0-\xFF]/'
对于旧的 perl 版本
perl -lne'print$.if/[\xE0-\xFF]/'
【讨论】:
一个关键的问题是
使用字节;
编译指示应该生效。海报应该决定这一点。对于选择代码大于 127 的 字符,以下内容就足够了:
print grep 127 < ord, split // while <>;
或
print grep /[^[:ascii:]]/, split // while <>;
【讨论】:
Hynek -Pichi- Vychodil 的回答:
perl -nE'say$.if/[\xE0-\xFF]/'
只测试非打印的有限部分大概应该是
perl -nE'say$.if/[\x80-\xFF]/'
改为。
【讨论】:
grep 呢?
grep [\x00-\x1F\x7F-\xFF]+ *
【讨论】: