ファイルがあり、そのファイルに英語のASCII文字のみが含まれていることを確認したいと思います。
とてもよくある質問のようですが、グーグルをしてみると直接的な回答や関連内容がありませんでした。
他の質問によると、これはこれまでに得たものですが、うまくいきません。 ASCII 文字であるか非 ASCII 文字であるかに関係なく、常に非 ASCII 文字であると判断されます。
if (LC_ALL=C; [[ $TEXT = *[[:ascii:]]* ]]) then
echo "Contain Non-ASCII"
fi
ところで、これはシェルスクリプトです。
答え1
コードは、変数値にTEXT
少なくとも1つのASCII文字が含まれているかどうかをテストします。 ASCII以外の文字が含まれているかどうかをテストするには、$TEXT
コレクションを逆にする必要があります。ところで、[: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