搜索包含非 ASCII 字符的文件

use*_*000 3 grep shell-script regular-expression text

我试图在包含一些非 ASCII Unicode 字符的目录中查找文件。我事先不知道我必须找到的确切字符。

从概念上讲,这应该是一项简单的任务 - 找到与 regex 匹配的所有文件[^\0-\x7f]。但是,我无法想出可以真正做到这一点的东西。

我能想到的最接近的事情是:

find . -type f -exec grep -Plv '[\0-\x7f]' {} \;
Run Code Online (Sandbox Code Playgroud)

由于空行匹配,最终列出了大多数普通文本文件。

-e开关不与组合允许的-P,所以我不能用-e '[\0-\x7f]' -e '^$',和正则表达式转换成[\0-\x7f]|^$将显然是错误的,因为现在它的“或”。

有没有另一种方法来搜索这样的字符?

Gil*_*il' 5

使用grep -Pv '[\0-\x7f]',您要求的行不 ( -v) 包含 ASCII 字符。这与包含非 ASCII 字符的行不同。就这么问吧。

LC_ALL=C grep -lP '[^\0-\x7f]'
Run Code Online (Sandbox Code Playgroud)

您可以在 ASCII 语言环境中请求不可打印的字符,而不是代码点范围。这几乎是等效的(它还包括控制字符)。

LC_ALL=C grep -l '[^[:print:]]'
Run Code Online (Sandbox Code Playgroud)

一种等效的、更复杂的方法是搜索完全由 ASCII 字符组成的行并反转匹配。

LC_ALL=C grep -vlP '^[\0-\x7f]*$'
Run Code Online (Sandbox Code Playgroud)