Bash
Glob
패턴 매칭 에는 두 가지 유형이 있습니다 Regex
. 일반적인 경험 법칙은 1) glob
파일 이름을 검색하기가 더 쉽다는 것입니다. 2) regex
텍스트를 검색하기가 더 쉽다는 것입니다.
Glob
시작 부분에는 메타 문자를 사용하고 regex
끝 부분에는 메타 문자를 사용하십시오 pattern
.
Glob Regex
?(pattern) (pattern)?
*(pattern) (pattern)*
+(pattern) (pattern)+
그래서 파일이 와일드카드(예: *.sh
)와 일치하는 방식을 이해하는 데 어려움을 겪고 있습니다. 와일드카드는 전역 패턴과 다릅니까? 내가 아는 한 검색 패턴에는 *.sh
다음 문자와 일치하는 메타 문자가 포함되어 있지 않습니다 *
.
답변1
와일드카드는 전역 패턴의 일부입니다. 가장 간단한 *
합계 ?
는 와일드카드와 전역 패턴입니다. 다음은 몇 가지 간단한 글로브입니다:
*.sh # could match "fred.sh" and also ".sh"
matchme # would match "matchme"
file[0-9]*.txt # could match "file12.txt" but also "file12yz.txt"
?ile # could match "mile" or "file" but not "smile"
귀하의 질문에 나열한 전역 패턴은 다음과 같습니다.확장하다글로벌 모드. bash
생성 시에는 활성화되어 있지만 활성화된 경우 파일 이름 일치에만 사용할 수 있기 때문 [[ "$var" == {pattern} ]]
입니다.extglob
shopt -s extglob # Enable extended globs (bash)
ls -d +([[:digit:]]) # List files/directories whose names are just digits
내가 아는 한 검색 패턴에는
*.sh
다음 문자와 일치하는 메타 문자가 포함되어 있지 않습니다.*
이 패턴은 0개 이상의 문자와 일치하는 와일드카드 문자를 사용합니다 *.sh
. *
glob은 정규 표현식(일반 또는 확장)이 아니지만 동일하다는 점을 기억하세요.
Glob RE Description
*.sh ^.*\.sh$ Match anything ending with the three characters ".sh"
?ile ^.ile$ Match any single character then the text "ile"
+([[:digit:]]) ^[[:digit:]]+$ Match one or more digits (potentially any alphabet, not just 0-9)
Extended Glob ERE Description
@(one|two) ^(one|two)$ Match either "one" or "two"
"1" 또는 "2"와 일치하는 일반 RE에는 대괄호와 구분 기호를 표시해야 합니다. 즉 ^\(one\|two\)$
, 포함되지 않기 때문입니다. 대조적으로, 확장 정규식에는 이러한 연산자가 포함되어 있습니다.^(one|two)$