在文件中查找非ASCII代码点

时间:2014-03-05 13:51:24

标签: regex linux encoding grep

我正在使用这个正则表达式来查找文件中的非ASCII代码点,无论编码是什么:

$ cat test.txt | hd | grep -P " [8-9a-f][\da-f]"

是否有更好,更简洁或更少hacky的方法?我通常使用grep -P "[^\x00-\x7f]"来查找令人反感的字符但在这里我正在寻找令人反感的代码点

请注意,当前hacky方法确实具有显示周围ASCII字符的良好副作用,这对于上下文非常好。

1 个答案:

答案 0 :(得分:1)

使用hd,这应该更快:

hd test.txt |grep -w '[89a-f][0-9a-f]'

grep -P调用libpcre并且速度较慢。grep -w只搜索“单词”并默认为标准posix正则表达式,这几乎与-F纯文本查询一样快。来自管道的cat也可以节省(微不足道的)努力。)

如果您不想要上下文,可以给grep -o标志。如果您希望更清楚地调出上下文,请考虑--color(或者甚至--color=always,如果您在某处输出输出并且不介意着色控制字符)。您可能还会发现grep的-n标志很有用,它会为您提供行号。

认为你可以使用grep的-a标志来实现你在一个命令中寻找的东西(这会强制所有内容都被读作文本而不是无用的“二进制文件test.txt匹配“输出”,但您可能不喜欢输出对终端的影响。也许将它管道传输到一个文件中,然后用vim查看该文件(与less不同,它不会呈现控制字符):

grep -aP '[^\x00-\x7f]' test.txt > found-highchars
view found-highchars

这可能会或可能不会比通过hdgrep

更快