Shell glob이 정규식의 "방언"으로 간주되지 않는 이유는 무엇입니까? [복사]

Shell glob이 정규식의 "방언"으로 간주되지 않는 이유는 무엇입니까? [복사]

나는 종종 Bash 3.x 쉘 전역 변수를 사용합니다.

?      # Match any single character.
*      # Match any string of characters (up until the asterisk).
[set]  # Match any character in set (but not the entire set itself).
[!set] # Match any character not in set.

정규 표현식을 사용하세요(특히폴리 메라 제 연쇠 반응).

내 질문은 왜 "Bash 정규 표현식"(예: "JavaScript 정규 표현식")으로 간주되지 않습니까?

정규식의 또 다른 "방언"으로 생각하면 어떨까요?

물론 이것은 비정통적인 일이겠지만, 그렇게 하지 말아야 할 공식적인 논리적 이유가 있는지는 잘 모르겠습니다.

답변1

파일 이름 글로빙 패턴과 정규 표현식에는 일부 구문이 겹치지만 근본적으로 다르게 작동합니다.

정규식은 e문자열과 일치 hello하지만 파일 이름 와일드카드 패턴은 e일치하지 않습니다. 와일드카드 패턴은 암시적으로 고정되므로 와일드카드 패턴은 e정규식과 동일해 보이지만 ^e$적용 방식은 다를 수 있습니다(정규식은 전체 텍스트 줄과 일치하는 반면, 와일드카드 패턴은 일반적으로 단일 파일 이름과 일치함).

*파일 이름 globbing 패턴 에는 정규 표현식과 같은 이전 표현식을 한정하는 특수 문자나 정규 표현식과 같이 표현식의 일부를 그룹화하는 도구 또는 표현식의 일부를 그룹화하는 도구도 없습니다. 가능한 하위 패턴을 교대로 사용하는 도구는 정규식에 있습니다. 일부 쉘은 활성화된 경우와 같이 분명히 이 중 일부를 추가합니다.?(...)|bashshopt -s extglob

와일드카드 패턴은 정규 표현식과 다른 용도로 사용됩니다. 정규 표현식은 다음과 같습니다.주로텍스트에서 문자열을 선택/일치하는 반면, 파일 이름 와일드카드 패턴은 다음과 같습니다.주로(그러나 이에 국한되지는 않음) 파일 이름을 일치시키거나 디렉터리에서 기존 이름 목록을 생성하는 데 사용됩니다. 일치하는 데 와일드카드 패턴이 사용됩니다.예를 들어 case ... esac, POSIX 쉘은 정규식을 사용하여 디렉토리에서 이름 목록을 생성하지 않는 한 절대 사용하지 않습니다.확장하다이런 능력을 가지세요.

두 가지 유형의 스키마 모두 POSIX 표준에 의해 정의됩니다.

와일드카드 패턴의 경우 표준은 먼저 다음과 같이 말합니다.

이 섹션에 설명된 패턴 일치 표기법은 문자열과 일치하는 셸의 패턴을 지정하는 데 사용됩니다.역사적으로 패턴 일치 표기법은 XBD 정규식에 설명된 정규식 표기법과 관련이 있지만 약간 다릅니다.. 따라서 이 패턴 일치 표기법의 규칙은 다음과 같이 설명됩니다.기반으로차이점을 설명하기 위해 수정된 정규식 표기법에 대한 설명입니다.

언급한 PCRE와 같은 정규식에는 여러 가지 "방언"이 있지만 파일 이름 글로빙 패턴은 실제로 그 중 하나라고 말할 수 없습니다.

SQL 쿼리에 사용되는 것과 같이 셸의 파일 이름 글로빙 패턴과 유사한 여러 패턴 언어가 있습니다 LIKE. 이는 매우 간단하며 문자열 비트를 일치시키는 편리한 방법으로 제공되는 경우가 많습니다. 이에 비해 정규식은 훨씬 더 복잡합니다.


bash" 정규 표현식"을 언급하셨습니다 . bash껍질하다정규식은 지원되지만 파일 이름 일치는 지원되지 않습니다. 에서 연산자 [[ ... ]]=~왼쪽 문자열과 오른쪽 정규식에 대해 정규식 일치를 수행합니다. 이러한 방식으로 셸에서 지원하는 정규식 유형은 bash정규식 확장의 표준 세트입니다. 자세한 내용은 bash시스템 설명서를 참조하십시오.

답변2

Globs와 정규 표현식은 서로 다른 두 가지 패턴 언어입니다. 특정 모드의 의미가 일부 중복된다는 사실이 모드 중 하나가 반드시 다른 모드의 "방언"이라는 의미는 아닙니다. 두 가지를 모두 사용해 본 사람이라면 둘의 유사점을 알지만, 이름을 다르게 유지하면 혼동의 가능성이 줄어듭니다.

관련 메모에 따르면 많은 유형의 정규식(적어도 기본, 확장 및 변형이 있는 Perl)이 매우 유사한 이름을 가지고 있다는 것이 불행한 일입니다. 내 경험에 따르면 대부분의 사람들은 자신이 의미하는 바를 한정하지 않으며 때로는 불필요한 혼란을 야기합니다. 이러한 맛에 좀 더 독특한 이름을 부여했다면 오해를 일으키지 않고 이야기하기가 더 쉬웠을 것입니다.

관련 정보