我目前正在使用这个正则表达式来查找文件中的非 ASCII 代码点,无论是什么编码:
$ cat test.txt | hd | grep -P " [8-9a-f][\da-f]"
是否有更好、更简洁或不那么 hacky 的方法? 我通常使用 grep -P "[^\x00-\x7f]"
来查找令人反感的内容字符,但在这里我要查找令人反感的代码点。
请注意,当前的 hacky 方法确实具有显示周围 ASCII 字符的良好副作用,这对于上下文非常有用。
最佳答案
使用高清,这应该会更快:
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
管道更快,也可能不会更快。
关于regex - 在文件中查找非 ASCII 代码点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22199706/