检查文件是否包含某些 ASCII 字符

Check if a file contains certain ASCII characters

我需要一个 unix 命令来验证文件是否只有 ASCII 可打印字符(介于 ASCII Hex 20 和 7E 之间)。

我收到以下命令来检查文件是否包含非 ASCII 字符,但无法解决我的上述问题。

if LC_ALL=C grep -q '[^[:print:][:space:]]' file; then
    echo "file contains non-ascii characters"
else
    echo "file contains ascii characters only"
fi 

很高兴拥有: - 停止加载结果。有时候一个就够了

要在文件中查找 207E 个字符,您可以使用:

grep -P "[\x20-\x7E]" file

注意 -P 执行 Perl 正则表达式的用法。

但在这种情况下,您想检查文件是否只包含这些字符。所以最好的办法是检查是否有任何不在这个范围内的,即检查 [^range]:

grep -P "[^\x20-\x7E]" file

总而言之,我会说:

grep -qP "[^\x20-\x7E]" file && echo "weird ASCII" || echo "clean one"

这可以在 unix 中使用 POSIX grep 选项完成:

if LC_ALL=C grep -q '[^ -~]' file; then
    echo "file contains non-ascii characters"
else
    echo "file contains ascii characters only"
fi

其中 [ ... ] 中的字符是 ^(插入符号)、space、-(ASCII 减号)、~(波浪号)。

您也可以指定 ASCII 制表符。该标准将这些称为 collating elements. It seems that both \x (hexadecimal) or [=17=] (octal) are shown in the standard description of bracket expressions (see 7.4.1)。因此,您可以使用 \x091 作为文字选项卡。

根据描述,默认情况下 -e 接受 basic regular expression (BRE)。如果你添加了一个 -E,你可以有一个扩展的正则表达式(但这不是必需的)。