다음 정규 표현식이 Linux에서 작동하지 않는 이유는 무엇입니까?

다음 정규 표현식이 Linux에서 작동하지 않는 이유는 무엇입니까?

특정 패턴과 일치하는 파일을 찾으려고 시도하고 있지만 아래 명령을 실행하려고 하면 패턴과 일치해야 하는 파일이 있음에도 불구하고 결과가 반환되지 않습니다.

find . -maxdepth 1 -regextype posix-extended -regex ".*/s_[a-zA-Z]_[a-zA-Z]\.png" -exec echo {} \;

나는 .*/전체 경로와 일치한다는 것을 알고 있지만 그것이 정확히 무엇을 의미하는지 잘 이해하지 못합니다.

예를 들어 일치해야 하는 파일은 다음과 같습니다.

  1. s_choose_blue.png
  2. s_choose_red.png
  3. s_new_blue.png

답변1

정규식의 실제 문제는 일치해야 하는 항목과 일치하지 않는다는 것입니다. 분석하려면:

  • .*/– 임의의 문자, 여러 번, 그 뒤에 슬래시가 옵니다. 이것은 기본적으로 실제 파일 이름 앞에 디렉토리 목록을 사용하므로 ./(예에서와 같이) 문자 그대로 일치하지만 ./some/other/dir/마지막 슬래시까지 일치합니다.

    이는 정규식이 기본적으로 "탐욕적"이기 때문에 작동합니다. 즉, 가능한 한 많이 일치한다는 의미입니다. 본질적으로 이 부분을 사용하면 실제 파일 이름을 검색하고 결과에서 경로를 제거할 수 있습니다.

    .*/요약하자면, 관심 있는 것이 실제 파일 이름뿐이라면 정규식 앞에 가 필요합니다 . 파일 경로의 일부 부분도 일치시켜야 하는 경우에는 다음을 사용할 수 없습니다..*/

  • s_– 이것은 귀하의 예에서는 잘 작동합니다

  • [a-zA-Z]– 이것은 단지 소비한다하나이 클래스의 캐릭터

  • _– 그 뒤에 밑줄이 옵니다.

  • [a-zA-Z]– 다시 이어서하나성격

  • \.png– 문자 그대로 점과 확장자가 일치합니다.

따라서 정규식을 다음과 같이 변경해야 합니다.

.*/s_[a-zA-Z]+_[a-zA-Z]+\.png

+기본적으로 이전 중 하나 또는 여러 개를 나타내는 를 사용해야 합니다 .

관련 정보