파일 이름이 특정 패턴과 일치하는지 확인하고 싶습니다.

파일 이름이 특정 패턴과 일치하는지 확인하고 싶습니다.

파일 이름이 영숫자 문자([a-zA-Z0-9])로 시작하고 영숫자 문자와 ".", "-" 및 "_" 문자만 포함하는 특정 패턴과 일치하는지 확인하고 싶습니다.

fileNamePattern="^[a-zA-Z0-9]+[\.-_]*"
if [[ $i(file from input) == $fileNamePattern ]]
      then
         echo "success"
      else
         echo "fail"
fi

이것이 제가 해결하려고 시도한 방법이지만 "[[" 뒤에 예상치 못한 연산자가 표시되지 않았습니다. 도와주세요.

답변1

확장 정규 표현식을 와일드카드 패턴으로 변환하는 경우 다음을 포함하지 않고도 case ... esacin을 사용하여 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-Z0-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.-Pgrep

관련 정보