쉘 스크립트의 텍스트에 ASCII가 아닌 문자가 포함되어 있는지 확인하십시오.

쉘 스크립트의 텍스트에 ASCII가 아닌 문자가 포함되어 있는지 확인하십시오.

파일이 있는데 그 파일에 영어 ASCII 문자만 포함되어 있는지 확인하고 싶습니다.

굉장히 흔한 질문인 것 같은데, 구글링을 해보니 직접적인 답변이나 관련 내용이 없었습니다.

다른 질문에 따르면 이것이 지금까지 얻은 것이지만 작동하지 않습니다. ASCII 문자인지 비ASCII 문자인지에 관계없이 항상 비ASCII 문자로 판단됩니다.

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

그건 그렇고, 이것은 쉘 스크립트입니다.

답변1

코드는 변수 값에 TEXT최소한 하나의 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, 유니코드, 바이너리 등)을 알 수 있습니다.

$ 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

관련 정보