다음 명령을 예로 들어 보겠습니다.
find . -regex ".*\.\(cpp\|h\)"
그러면 디렉터리에 있는 모든 .h 및 .cpp 파일이 검색됩니다. 마침표 문자 "."는 일반적으로 정규식에서 "모든 문자"를 의미합니다. 실제 마침표만 일치시키려면 백슬래시 문자 "\"로 이스케이프해야 합니다.
이 경우 특별한 의미를 가진 문자가 주어지면 해당 문자가 나타내는 실제 문자를 얻으려면 해당 문자를 이스케이프 처리해야 합니다.
이제 각각 "(", ")" 및 "|" 문자인 괄호와 "or" 열을 사용합니다. 또한 특별한 의미를 가지며 정규 표현식을 그룹화하는 데 사용됩니다. 그러나 특별한 의미를 얻으려면 백슬래시를 사용하여 문자를 이스케이프해야 합니다! 백슬래시가 없으면 이러한 문자는 해당 문자가 나타내는 실제 문자의 의미를 가집니다.
'.'가 '(', ')' 및 '|'와 다르게 처리되는 이유는 무엇입니까?
답변1
대답은 실제로 "그냥"입니다. 다양한 정규식 구문이 있으며 모양이 비슷하고 일반적으로 기본 사항은 동일하지만 세부 사항에서는 다릅니다.
역사적으로 각 도구에는 작성자가 가장 좋다고 생각한 작업을 수행하는 자체적인 새로운 구현이 있었습니다. 문자를 특별하게 만드는 것(이스케이프 포함 여부) 사이에는 균형이 있습니다. "자연적으로 특별한" 문자가 너무 많아서 일치시키기 위해 항상 문자를 이스케이프해야 하거나 반대로 결국 여러 가지 문자가 필요하게 됩니다. () 그룹화와 같은 일반적인 정규식 구문을 사용하도록 이스케이프합니다. 프로그램을 작성하는 모든 사람은 자신의 프로그램에 맞는 요구 사항, 올바른 접근 방식이라고 생각하는 것, 달의 위상에 따라 무엇을 할지 결정합니다.
POSIX는 표준화를 시도하며 "기본 정규식" 그리고"확장 정규식\
". 놀랍게도 이러한 노력은 다음 과 같은 측면에서 거꾸로 작용합니다 .때때로, 그러나 완벽한 일관성은 아닙니다.
Perl 정규식은 두 가지 이유로 또 다른 사실상의 표준이 되었습니다. 첫째, 매우 유연하고 강력하며, 둘째,실제로는 매우 현명하다, "\는 항상 영숫자가 아닌 문자를 이스케이프합니다"와 같은 규칙을 사용합니다.
GNU Find에는 -regextype
사용된 정규식 구문을 변경할 수 있는 옵션이 있습니다. 불행하게도 "perl"은 적어도 내 버전의 find에서는 옵션이 아닙니다. (GNU 기본값은 "emacs"인데 이는 놀라운 일이 아닙니다. 구문은 다음과 같습니다.여기에 녹음하세요.)