파일 이름이 영숫자 문자([a-zA-Z0-9])로 시작하고 영숫자 문자와 ".", "-" 및 "_" 문자만 포함하는 특정 패턴과 일치하는지 확인하고 싶습니다.
fileNamePattern="^[a-zA-Z0-9]+[\.-_]*"
if [[ $i(file from input) == $fileNamePattern ]]
then
echo "success"
else
echo "fail"
fi
이것이 제가 해결하려고 시도한 방법이지만 "[[" 뒤에 예상치 못한 연산자가 표시되지 않았습니다. 도와주세요.
답변1
확장 정규 표현식을 와일드카드 패턴으로 변환하는 경우 다음을 포함하지 않고도 case ... esac
in을 사용하여 dash
변수 값이 일치하는지 확인할 수 있습니다 grep
.
case $name in
[a-zA-Z0-9]*[._-]*)
echo success
;;
*)
echo failure
esac
이 패턴은 일치하는 문자로 시작하고 점, 밑줄 또는 대시도 포함하는 값과 일치합니다 [a-zA-Z0-9]
(표현식이 마지막 문자 집합을 허용하더라도 확인하고 싶은 것이라고 생각합니다).아니요문자열에 존재합니다). .
및 _
( ) .-_
사이의 범위를 사용하는 것은 그다지 의미가 없기 때문에 대시를 대괄호 표현식의 끝으로 이동했습니다 . 나는 또한 당신을 가정아니요리터럴 백슬래시와 일치시키고 싶습니다. 이렇게 하려면 \\
두 번째 대괄호 표현식에 추가하세요.
글쎄요것 같다*
괜찮습니다. 하지만 , 또는 가 아닌 영숫자가 아닌 문자와 계속 일치할 수 있으므로 원하는 작업을 수행하지 않습니다 ..
_
-
테스트의 의미를 바꿔서 다음 이름을 테스트해 보겠습니다.실패하다:
case $name in
*[![:alnum:]_.-]*)
echo failure
;;
*)
echo success
esac
이제 값에 존재할 것으로 예상되지 않는 문자가 포함된 값을 감지합니다. 가치가 있는지 제대로 테스트하지 않았습니다.시작하지만 영숫자로...
case $name in
*[![:alnum:]_.-]*)
echo 'failure (contains wrong characters)'
;;
*)
case $name in
[[:alnum:]]*)
echo success
;;
*)
echo 'failure (does not start with alnum)'
esac
esac
이는 최대 두 번의 테스트를 수행합니다. 먼저 값에 원하지 않는 문자가 포함되어 있는지 확인한 다음, 그렇지 않은 경우 올바른 유형의 문자로 시작하는지 확인합니다.
답변2
POSIXly에서 문자열을 정규식과 일치시키려면 expr
다음을 사용할 수 있습니다 awk
.
bre_match_anchored_at_start() { expr "x$1" : "x$2" > /dev/null; }
ere_match() { awk 'BEGIN{exit(!(ARGV[1] ~ ARGV[2]))}' "$1" "$2"; }
그런 다음 다음을 사용할 수 있습니다.
if bre_match_anchored_at_start "$string" '[a-zA-Z0-9][a-zA-Z0-9._-]*$'; then
echo match
fi
또는:
if ere_match "$string" '^[a-zA-Z0-9][a-zA-Z0-9._-]*$'; then
echo match
fi
그러나 무엇이나 a-z
일치하는 항목은 지정되지 않았으며 C/POSIX 로케일 외부의 대부분의 시스템에서는 다소 무작위입니다. 대신 모든 영숫자 문자와 일치하는(POSIX, 그러나 모든 구현에서 지원되는 것은 아님)을 사용할 수 있습니다(C 로캘이 아닌 경우 아마도 영어 문자 52개와 십진수 10개가 훨씬 넘을 것임). 이들만 일치시키려면 다음을 수행할 수 있습니다.A-Z
0-9
[[:alnum:]]
awk
if (export LC_ALL=C; ere_match "$string" '^[a-zA-Z0-9][a-zA-Z0-9._-]*$'); then
echo match
fi
부정적인 접근 방식으로 표준 쉘 구성을 사용하여 동일한 결과를 얻을 수도 있습니다.
case $string in
("" | [!a-zA-Z0-9]* | *[!a-zA-Z0-9._-]*) ;;
(*) echo match;;
esac
답변3
[[ "$filename" =~ pattern ]]
사용할 수 없는 경우 다음을 사용할 수 있습니다 grep
.
if printf '%s' "$filename" | grep -qz 'pattern'; then
echo "success"
else
echo "fail"
fi
참고, grep
활용하세요기본 정규식기본값으로. 당신의 -E
.-P
grep