Bash: 파일 경로 비교를 위한 정규식

Bash: 파일 경로 비교를 위한 정규식

입력 문자열이 허용된 파일 경로와 일치하는지 확인한 다음 몇 가지 작업만 수행하고 싶습니다.

나는 이런 일을하고있다

path1="mydir/**"
path2="mydir/testing"

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

경로가 다음과 같다면

mydir/test/dir
mydir/othertest/dir

이것들은 통과되어야 합니다.

위의 확인 결과 오류가 발생했습니다.

assets/bin/copymain: line 8: [: too many arguments

답변1

유일한 요구 사항이 특정 방식으로 끝나거나 시작하는 경로/문자열을 비교하는 것이라면 정규 표현식이 필요하지 않습니다.

d1=mydir/test/dir
d2=mydir/othertest/dir
d3=mydir-2/test/dir-2

[[ "$d1" == mydir/* ]] && echo matches
[[ "$d2" == mydir/* ]] && echo matches
[[ "$d3" != mydir/* ]] && echo no-match

[[ "$d1" == */dir ]] && echo matches
[[ "$d2" == */dir ]] && echo matches
[[ "$d3" != */dir ]] && echo no-match

답변2

path1="mydir/**"
path2="mydir/testing"

여기에 사용된 와일드카드 패턴은 path1="mydir/**"비교에 사용된 확장 정규식과 완전히 다른 언어입니다.

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

그러나 조건은 정규식을 사용합니다.

[[ "$path2" =~ "$path1" ]]

[ [과 사이에 공백을 추가하지 ] ]마십시오 [[.]]

매개변수 확장 와일드카드와 정규식은 서로 다른 두 가지 패턴 언어입니다.

화이트리스트 패턴을 포함하는 경우 $path1정규식에 다음과 같이 작성해야 합니다.

path1='^mydir/'
path2="mydir/testing"

[[ ${path2} =~ ${path1} ]] && echo "Matches"

오른쪽에는 path1따옴표로 묶을 수 없는 RegEx 변수가 있습니다. 이렇게 하면 위와 같은 정규식 연산자가 문자 그대로 인식됩니다 ( option 또는 set 을 ^설정하지 않는 한 ).compat31BASH_COMPAT=3.1

관련 정보