정규식이 파일을 필터링하는 데 사용되는 와일드 카드와 다른 점 *.cC 파일을

에서 *0 개 이상의 이전 문자를 나타내는 데 사용하지만 grep, 같은 명령으로 *.cC 파일을 사용할 때 모든 C 파일을 찾는 데 사용합니다 . 누군가이 두 가지 경우 의 사용법이 어떻게 다른지 말할 수 있습니까?lsls *.c*



답변

쉘 파일 이름 globbing정규 표현식 은 동일한 문자를 사용하며 비슷한 목적을 가지고 있지만 맞습니다. 호환되지 않습니다. 파일 이름 글 로빙은 훨씬 덜 강력한 시스템입니다.

파일 이름 글 로빙에서 :

  • * “0 개 이상의 문자”를 의미

  • ? “단일 문자”를 의미

그러나 정규 표현식에서 .*“0 개 이상의 문자”를 .의미하고 “모든 단일 문자”를 의미해야합니다. A ?는 정규 표현식에서 매우 다른 것을 의미합니다. 앞의 RE 요소의 0 또는 1 인스턴스.

대괄호 ( [])는 최소한 간단한 경우에 이것을 입력하는 시스템의 두 시스템에서 동일하게 작동하는 것으로 보입니다. 여기에는 POSIX 문자 클래스 (예 :)가 포함됩니다 [:alpha:]. 즉, 다양한 시스템 유형에서 작업하기 위해 명령이 필요한 경우 문자 목록과 같은 기본 항목 이외의 다른 것을 사용하지 않는 것이 좋습니다 (예 :[abeq] 🙂 및 문자 범위 (예 :)와[a-c] .

이러한 차이점으로 인해 두 시스템은 단순한 경우에 대해서만 직접 교환 할 수 있습니다. 파일 이름의 정규식 일치가 필요한 경우 다른 방법으로 수행해야합니다. find -regex하나의 옵션입니다. ( find -name글로브 구문을 사용하는 방법 도 있습니다 .)


답변

원래 제목으로 표현 된 질문에 대한 답변 :

정규식이 파일을 필터링하는 데 사용 된 것과 다른 이유무엇 입니까?

파일 이름 확장은 대부분의 운영 체제 (와일드 카드 / 조커 문자)에 이미 존재하는 정규식보다 우선하며 후자보다 훨씬 간단하고 직관적입니다.

*.txt일반 사용자는 쉽게 이해할 수 있지만 비슷한 .*\.txt것은 숙련 된 사용자 / 프로그래머를 대상으로하며, 말할 것도 없습니다 ^.*\.txt$.