유틸리티“find”의 정규식에서 개선 된 기능 관련 문제


0

예를 들어 파일을 찾지 못합니다.

: > 12; basename $(find -E . -regex '^(.*)(\d{2})' -print 2>/dev/null)

그러나 이것은 :

basename $(find -E . -regex '^(.*)([0-9]{2})' -print 2>/dev/null)

동시에 예를 들면 다음과 같습니다.

echo -e '12\nabc\n456' | grep -E -e '^(\d{3})'

겉보기에는 같은 것을 사용하지만 꽤 잘 작동합니다 regcomp().

내가 뭘 잘못하고 있으며 어떻게 해결할 수 있습니까?


1
최신 OS X grepBSD코드 기반이 아닌 코드 기반을 사용합니다 GNU grep. -E옵션의 MOSH입니다 POSIX ERE and PCRE및 OS X의가 나는 독점적 믿고 find사용 BRE하고 ERE\d문자 클래스가 유효하지 않습니다.
fd0

@ fd0 최고의 코멘트!
cave-canem

답변:


1

기본 MacOS find에는 해당 -regex옵션이에서 설명한 바로 가기를 올바르게 처리하지 못하는 버그가있는 것으로 보입니다 man re_format. 다음 명령이 작동하는 것 같습니다.

find -E . -regex '^(.*)([[:digit:]]{2})' -print

이 약간 더 간단한 변형도 작동하는 것 같습니다.

find -E . -regex '.*[[:digit:]]{2}' -print

짧은에서 grep -EfindS의 -regex옵션 정확히 같은 방식으로 정규 표현식을 처리하지 못하는 것 같습니다.


@Erik 풀러, 나는 그것이뿐만 아니라 같이, 다른 무언가에 대해 생각 gfind . -regextype 'egrep' -regex '^(.*)(\d{2})' -print 2>/dev/null작동하지 않습니다
동굴 canem

gfind에 동일한 버그가있을 수 있습니다. 어쨌든 실행 가능한 해결 방법이있는 것 같습니다.
Eirik Fuller

문제는 전체 클래스의 "향상된 기본 및 향상된 확장 RE"를 제거한다는 것입니다. "egrep을"이 제대로 작동 왜 같은 사용하기 때문에이 경우에는, 분명하지 않다regcomp ()
동굴 canem

확장 된 RE 중 일부는 제외하지만 전부는 아닙니다. [[:digit:]]이 답변에 설명 된 구조는에서 작동하지 않는 것 find없이 -E.
Eirik Fuller

확장 된 RE가 아니라 "향상된 기본 및 확장 된 확장 된 RE"
cave-canem

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.