문자열 일치 대신 파일 일치에 정규식을 사용하십시오.

문자열 일치 대신 파일 일치에 정규식을 사용하십시오.

grep다음을 사용하여 특정 문자열을 검색하는 방법을 알아 "9"내려고 합니다 .b

시도해 보았 grep -e "9" b으나 파일을 찾을 수 없다고 나옵니다 b. (해당 옵션을 사용하지 않는 경우에도 마찬가지입니다 -e.)

나는 그것을 할 수 있다는 것을 알고 있지만 grep -e "9" *b*그것은 내 초점이 아닙니다. 정규식의 일반적인 도구를 사용하여 파일 이름 일치를 수행하고 싶습니다.

나는 이것을 얻기 위한 복잡한 방법에는 관심이 없습니다. grep이 목적을 위한 간단한 옵션이 있었으면 좋겠습니다 . 끝까지 읽었 man지만 유용한 내용을 찾을 수 없었습니다. 하지만 쉘 스크립팅이 처음이라 쉽게 놓칠 수 있었습니다.

파일 이름 일치에 정규식을 사용할 수 있습니까?오직 grep? 그렇다면 어떻게 해야 할까요?

답변1

grep기본적으로 정규식을 사용하여 파일을 일치시키는 옵션은 없습니다 .

두 가지 옵션이 있습니다:

  1. 예를 들어 쉘 글로브를 사용하십시오.

    grep -e '9' b*
    

    위의 예는 매우 간단한 예이지만, 특히 일부 확장 메커니즘을 사용하는 경우 매우 독특한 파일 이름을 일치시킬 수 있습니다. 아래에는 bash활성화할 수 있는 몇 가지 유용한 기능이 나열되어 있으며, 비슷한 기능은 zsh다른 셸에서도 찾을 수 있습니다.

    • globstar( **전체 디렉토리 트리를 일치시키기 위해)
    • nocaseglob(대소문자를 구분하지 않는 일치)
    • extglob(확장 모드: ?(), @(), !(), *(), +())
    • nullglob(일치하지 않는 패턴은 빈 문자열로 확장됩니다.)
  2. find파일을 검색하고 실행하는 데 사용됩니다 grep.

    find . -name 'b*' -exec grep '9' {} +
    

    또는 정규 표현식이 필요한 경우:

    find . -regex './b.*' -exec grep '9' {} +
    

    이 접근 방식의 장점은 다른 스위치를 추가하여 find이름뿐만 아니라 날짜, 크기 등을 기준으로 파일을 선택할 수 있다는 것입니다. 이는 표준 쉘의 glob zsh기능을 사용하지 않는 한 수행할 수 없습니다.글로벌 예선.

관련 정보