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


15

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

답변:


30

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

파일 이름 글 로빙에서 :

  • * "0 개 이상의 문자"를 의미

  • ? "단일 문자"를 의미

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

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

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


2
나는 그것이 globbing이라고 불렀습니다 :)
user3539

3
또한 다양한 종류의 정규 표현식이 있습니다. 모든 정규식이 동일한 것은 아닙니다! 그리고 당신은 SQL과 같은 다른 많은 패턴 매칭 시스템,이 같은 경우, '%'수단을 '*'.
Mr Lister

4
정규 표현식의 두 가지 주요 특징은 POSIX와 PCRE (Perl Compatible RE)입니다. 후자는 오래 걸리지 않으며 더 많은 기능이 있습니다. 유닉스 도구와 쉘은 일반적으로 POSIX를 사용하며 내장 정규 표현식 (쉘 제외)이있는 대부분의 프로그래밍 언어는 PCRE를 사용합니다. 온라인에서 자료를 읽을 때 차이점을주의하십시오.
goldilocks

11

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

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

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

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


2
“왜”부분의 또 다른 이유 : 속도. 정규 표현식은 느린 : pastebin.com/3iNCgkE3
manatwork

3
*.txt같지 않습니다 (적어도 합리적인 파일 이름 globbing 가정) 이후에는 아무것도 없기 때문에 .*\.txt(대부분) 동일 합니다. 아마도 사용법에 따라 다소 달라질 수 있습니다. 요점을 증명합니까? .*\.txt$.txt^.*\.txt$
CVn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.