检查 shell 脚本中的文本是否包含非 ASCII 字符

检查 shell 脚本中的文本是否包含非 ASCII 字符

我有一个文件,我想确定它是否只包含英文 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

相关内容