我正在使用这个正则表达式来查找文件中的非ASCII代码点,无论编码是什么:
$ cat test.txt | hd | grep -P " [8-9a-f][\da-f]"
是否有更好,更简洁或更少hacky的方法?我通常使用grep -P "[^\x00-\x7f]"
来查找令人反感的字符但在这里我正在寻找令人反感的代码点。
请注意,当前hacky方法确实具有显示周围ASCII字符的良好副作用,这对于上下文非常好。
答案 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
这可能会或可能不会比通过hd
和grep
。