
파일이 있는데 그 파일에 영어 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