
다음과 같은 파일이 있는데 다음과 같이 일치시켜야 합니다.
./foo.bar1.sh -match
./qux/foo.bar2.sh -match
./foo.sh -match
./baz.sh -no match
./foo.bar3 -no match
나는 시도했다:
find . -regex ".*foo(bar[0-9])?\.sh"
그러나 아무것도 반환하지 않습니다. 해당 정규식이 작동하지 않는 이유를 알 수 없습니다.
답변1
정규식에 두 가지 오류가 있습니다.
뒤에 (문자 그대로) 점이 누락되었습니다
foo
.find
다음과 같은 경우 괄호를 이스케이프해야 합니다.~ 아니다문자 그대로의 괄호로 사용됩니다.
sh
또한 모든 문자와 일치하므로 앞에 점을 이스케이프 처리해야 합니다 .
이제 수정된 명령은 다음과 같습니다.
find . -regex ".*foo\(\.bar[0-9]\)?\.sh"
그런데 오류 2는 내가 find
의 -regex
스위치를 좋아하지 않는 이유입니다. 일관성 없는 탈출입니다.
물론 작동하지만 grep -P
PCRE(Perl Compatible Regular Expressions)를 사용하므로 더 많은 기능이 있지만 놀라움과 함정은 적습니다.
개인적으로 다음을 사용합니다.
find . | grep -P "foo(\.bar\d)?\.sh"