web-dev-qa-db-ja.com

シェルスクリプトでテキストに非ASCII文字が含まれているかどうかを確認する

ファイルがあります。英語のASCII文字のみが含まれているかどうかを確認します。

これは非常に一般的な質問だと思いましたが、グーグルで検索すると、直接の回答や関連する質問はありません。

他のいくつかの質問によると、これは私がこれまでに得たものですが、これは機能しません。 ASCIIまたはNon-ASCII文字のいずれであっても、常に非ASCIIとして決定されます。

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

ところで、これはシェルスクリプトです。

4
SnowWolf

コードは、変数TEXTの値に少なくとも1つの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

fileコマンドは、ファイルのタイプ(ASCII、Unicode、バイナリなど)を通知します。

$ file my_file.txt
my_file.txt: ASCII text

したがって、出力に「ASCII」という単語が含まれていることを確認するだけで、これが機能するはずです。

if [[ file my_file.txt | grep -i ascii ]] ...
3
gardenhead