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

Sno*_*olf 6 bash character-encoding shell-script

我有一个文件,我想确定它是否只包含英文 ASCII 字符。

我以为这是一个很常见的问题,但是当我搜索它时,没有直接的答案或相关的答案。

根据其他一些问题,这是我到目前为止所得到的,但这不起作用。无论是 ASCII 还是非 ASCII 字符,它总是会被确定为非 ASCII。

if (LC_ALL=C; [[ $TEXT = *[[:ascii:]]* ]]) then
  echo "Contain Non-ASCII"
fi
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这是一个shell脚本。

Gil*_*il' 9

您的代码测试变量的值是否TEXT至少包含一个 ASCII 字符。如果要测试是否$TEXT包含非 ASCII 字符,则需要将集合取反。顺便说一下,[:ascii:]它与语言环境无关,因此您无需设置LC_CTYPE.

if [[ $TEXT = *[![:ascii:]]* ]]; then
  echo "Contain Non-ASCII"
fi
Run Code Online (Sandbox Code Playgroud)

请注意,这[:ascii:]是一个 bash(和 zsh)功能。如果您希望您的脚本在 ksh 或普通 sh 中工作,您将需要使用语言环境。这是一个便携式方法:

LC_CTYPE=C
case $TEXT in
  *[![:cntrl:][:print:]]*) echo "Contain Non-ASCII";;
esac
Run Code Online (Sandbox Code Playgroud)

如果要检查文件内容,请使用grep

if LC_ALL=C grep -q '[^[:cntrl:][:print:]]' somefile; then
  echo "Contain Non-ASCII"
fi
Run Code Online (Sandbox Code Playgroud)


gar*_*ead 6

file命令可以告诉您文件的类型(ASCII、unicode、二进制等)。

$ file my_file.txt
my_file.txt: ASCII text
Run Code Online (Sandbox Code Playgroud)

因此,您只需检查输出是否包含单词“ASCII”,这应该可以工作:

if [[ file my_file.txt | grep -i ascii ]] ...
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考 - 小心 grep 单独的“ASCII”。除普通 ascii 之外的其他内容可能来自“文件”。例如:非 ISO 扩展 ASCII 文本 (2认同)

Sno*_*olf -1

TEXT=SOMETEXTHERE

RESULT=$(echo $TEXT | LC_COLLATE=C grep -r '[^ -~]')
if [ -z "$RESULT" ]; then
    echo "ALL ASCII"
else
    echo "Contain Non-ASCII"
fi
Run Code Online (Sandbox Code Playgroud)