![쉘 스크립트의 텍스트에 ASCII가 아닌 문자가 포함되어 있는지 확인하십시오.](https://linux55.com/image/62512/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98%20%ED%85%8D%EC%8A%A4%ED%8A%B8%EC%97%90%20ASCII%EA%B0%80%20%EC%95%84%EB%8B%8C%20%EB%AC%B8%EC%9E%90%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%98%EC%96%B4%20%EC%9E%88%EB%8A%94%EC%A7%80%20%ED%99%95%EC%9D%B8%ED%95%98%EC%8B%AD%EC%8B%9C%EC%98%A4..png)
파일이 있는데 그 파일에 영어 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