환경 변수를 만들었습니다.
WD=`pwd`
공백이나 영어가 아닌 문자가 포함되어 있는지 확인하는 방법은 무엇입니까?
답변1
"비영어 문자"란 일반 라틴 문자 26개가 아닌 문자를 의미한다고 생각합니다. 엄밀히 말하면 귀하의 요구 사항을 충족하는 테스트는 다음과 같습니다.
if tmp=${WD//[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]/};
[[ $tmp = *[[:alpha:] ]* ]]; then
# $WD contains letters other than A-Z and a-z or a space
즉, 영문자를 제거하고 여전히 문자나 공백이 있는지 확인합니다.
¿
실제로는 또는 또는 £
와 같이 문자가 아닌 문자를 포함하여 ASCII가 아닌 모든 문자와 모든 공백을 피하려고 하는 것 같습니다 ٣
. !
통과하지 못하는 문자 ~
(예: 공백을 제외한 ASCII 문자)를 일치시켜 이를 수행할 수 있습니다 .
if (LC_ALL=C; [[ $WD = *[^!-~]* ]]) then …
알아채다범위는 사용자가 설정한 기대치에 따라 항상 성능이 좋 !-~
거나 그렇지는 않습니다 .A-Z
LC_COLLATE
그래서 우리는 이를 LC_ALL
알려진 값( LC_ALL
모든 값보다 우선함) 으로 설정했습니다.로케일설정).
파일에서 "비정상적인" 문자를 확인하는 경우(대부분의 최신 플랫폼에서 허용되는 공백을 제외하려는 이유) 이식할 수 없는 문자를 허용하지 않는 보다 제한적인 목록을 갖는 것이 합리적일 수 있습니다. .POSIXASCII 문자, 숫자 및 -._
.
if (LC_ALL=C; [[ $WD = *[^-._0-9A-Za-z]* ]]) then …
답변2
정규 표현식은 grep
당신이 찾고 있는 것입니다.
영어가 아닌 문자나 숫자를 일치시킵니다 /
(모든 경로의 일부이기 때문입니다).
if [[ -n "$( pwd | grep -o -P "([^a-zA-Z0-9\/])*" )" ]]; then
echo "error"
fi
sed
이 경우에도 사용할 수 있습니다.
올바른 기호를 모두 로 바꾸고 남은 것이 있는지 확인하십시오 ${WD}
. ''
결과 문자열의 길이가 0이 아닌 경우 ${WD}
이는 잘못된 것입니다.
/
따라서 숫자와 문자 만 예상한다면 말이죠 .
if [[ -n "$( pwd | sed -r -e 's/([a-zA-Z0-9\/])*//g' )" ]]; then
echo "error"
fi
답변3
tr
이 경우 grep
or보다 약간 간단합니다.sed
if [[ -n "$(echo $WD|tr -d '[:alnum:]/')" ]];then
echo "gotcha"
fi
답변4
Bash는 자체 패턴 일치를 수행할 수 있습니다.
if [[ ${WD} = *[^[:alnum:]/]* ]]; then
echo 'Baaaad.'
fi