如何使用 Perl 在文件中查找扩展的 ASCII 字符?谁能拿到剧本?
.....提前致谢.....
由于扩展的ASCII字符具有128 或更高的值,因此您可以对单个字符调用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 的行。
编辑:更改为打印行号而不是行本身。
单线:
perl -nE'say$.if/[\xE0-\xFF]/'
对于旧的 perl 版本
perl -lne'print$.if/[\xE0-\xFF]/'
一个关键的问题是是否
使用字节;
pragma 应该生效。海报应该决定这一点。对于选择代码大于 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]+ *