전역 및 정규식 일치

전역 및 정규식 일치

BashGlob패턴 매칭 에는 두 가지 유형이 있습니다 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)$

관련 정보