如何使用Perl在文件中找到扩展的ASCII字符?任何人都可以获得剧本吗?
.....提前感谢.....
答案 0 :(得分:10)
由于扩展的ASCII字符的值为128 and higher,因此您只需在单个字符上调用ord并处理值> gt = 128的字符。以下代码从stdin读取仅打印扩展的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);
}
}
(感谢$.
提示{{1}}。
答案 1 :(得分:7)
第一个可打印的ASCII字符是space
(32)。最后一个可打印的ASCII字符是~
(126)。所以我可能会使用
while (<>) {
print "$.\n" if /[^ -~]/;
}
虽然它确实会显示包含控制字符和扩展ASCII的行。
修改:更改为打印行号而不是行本身。
答案 2 :(得分:5)
Oneliner:
perl -nE'say$.if/[\xE0-\xFF]/'
用于较旧的perl版本
perl -lne'print$.if/[\xE0-\xFF]/'
答案 3 :(得分:2)
一个关键问题是
使用字节;
pragma应该有效。海报应该决定。要选择代码大于127的字符,以下内容就足够了:
print grep 127 < ord, split // while <>;
或
print grep /[^[:ascii:]]/, split // while <>;
答案 4 :(得分:1)
Hynek -Pichi- Vychodil的回答:
perl -nE'say$.if/[\xE0-\xFF]/'
只测试非打印的有限部分应该是
perl -nE'say$.if/[\x80-\xFF]/'
代替。
答案 5 :(得分:1)
grep怎么样?
grep [\x00-\x1F\x7F-\xFF]+ *