我有一个文件,我想确定它是否只包含英文 ASCII 字符。
我认为这是一个很常见的问题,但是当我用谷歌搜索时,没有直接的答案或相关的。
根据其他一些问题,这是我到目前为止得到的,但这不起作用。无论 ASCII 字符还是非 ASCII 字符,它总是被判定为非 ASCII。
if (LC_ALL=C; [[ $TEXT = *[[:ascii:]]* ]]) then
echo "Contain Non-ASCII"
fi
顺便说一句,这是一个 shell 脚本。
答案1
您的代码测试变量的值是否TEXT
至少包含一个 ASCII 字符。如果要测试是否$TEXT
包含非ASCII字符,则需要反转集合。顺便说一句,[:ascii:]
与区域设置无关,因此您不需要设置LC_CTYPE
.
if [[ $TEXT = *[![:ascii:]]* ]]; then
echo "Contain Non-ASCII"
fi
请注意,这[:ascii:]
是 bash(和 zsh)功能。如果您希望脚本在 ksh 或普通 sh 中工作,则需要使用区域设置。这是一个便携式方法:
LC_CTYPE=C
case $TEXT in
*[![:cntrl:][:print:]]*) echo "Contain Non-ASCII";;
esac
如果您想检查文件内容,请使用grep。
if LC_ALL=C grep -q '[^[:cntrl:][:print:]]' somefile; then
echo "Contain Non-ASCII"
fi
答案2
该file
命令可以告诉您文件的类型(ASCII、unicode、二进制等)。
$ file my_file.txt
my_file.txt: ASCII text
因此,您只需检查输出是否包含单词“ASCII”,这应该可以工作:
if [[ file my_file.txt | grep -i ascii ]] ...
答案3
TEXT=SOMETEXTHERE
RESULT=$(echo $TEXT | LC_COLLATE=C grep -r '[^ -~]')
if [ -z "$RESULT" ]; then
echo "ALL ASCII"
else
echo "Contain Non-ASCII"
fi