정규식 검색을 올바르게 사용하는 방법은 무엇입니까?

정규식 검색을 올바르게 사용하는 방법은 무엇입니까?

옵션을 사용하여 find의 올바른 사용법을 알 수 없습니다 -regex.

예를 들어, 다음 예가 주어집니다.

Morcheeba/Big Calm/02 Shoulder Holster.flac
Morcheeba/Big Calm/02. Shoulder Holster.flac

path/to/file/## filename.ext점 없이 형식의 문자열을 일치시키고 싶습니다 .

나는 이전에 시도했습니다:

find Morcheeba/ -regextype egrep -iregex ".*[0-9]{2}*[a-z]*flac$"

그리고 약간의 변형이 있지만 항상 모든 파일을 얻거나 전혀 얻지 못합니다.

뭐가 문제 야?

미리 감사드립니다.

답변1

-regex/ (GNU 확장자) 는 파일 이름뿐만 아니라 전체 경로에서 -iregex표준 일치처럼 작동합니다 .-path

해당 파일을 찾고 싶다면이름(대) 2개의 십진수로 시작하고 그 뒤에 십진수가 아닌 숫자가 오고 로 끝나는 경우 .flac다음을 휴대용으로 수행할 수 있습니다.

find . -name '[0-9][0-9][!0-9]*.[fF][lL][aA][cC]'

일치하는 항목이 없기 01.flac때문에 일치하지 않습니다 . [!0-9]대신 다음과 같이 작성할 수 있습니다.

find . -name '[0-9][0-9][!0-9]*' -name '*.[fF][lL][aA][cC]'

정규식 대신 와일드카드 패턴을 사용합니다.

GNU를 사용하려면 find다음 -iregex과 같습니다.

find . -regextype egrep -iregex '.*/[0-9]{2}[^0-9/][^/]*\.flac'
find . -regextype egrep -iregex '.*/[0-9]{2}([^0-9/][^/]*)?\.flac'

즉, 정규 표현식의 나머지 부분이 확장되지 않도록 하기 때문에 두 숫자를 처음에 고정합니다 /.

답변2

@steeldriver가 제안한 것처럼 정규 표현식이 .*[0-9]{2}[^.]*\.flac제대로 작동합니다.

관련 정보