숫자 파일 확장자만 일치

숫자 파일 확장자만 일치

숫자 파일 확장자와만 일치하는 UNIX 패턴을 찾으려고 합니다. 예를 들어 다음과 같습니다.

  • 파일 1
  • 파일.2
  • 문서 1.1
  • 5파일 2.52
  • 파일.25938

잠깐만, 그런데 일치하지 않을 것 같아

  • 파일 1.0.ext
  • 파일 4.csv
  • 6파일 5.5.2.ext
  • File.1s
  • 파일.s134

나는 이것이 쉬울 것이라고 생각했지만 이해하지 못하는 것 같습니다. 시도해 보았습니다.

  • *.[0-9]*는 file1.0.csv와 일치합니다.
  • *.[0.9]*/>는 어떤 것과도 일치하지 않습니다.

내가 무엇을 놓치고 있는지 아는 전문가가 있나요? 내 생각엔 // 단어 끝에서 일치한다고 생각합니다.

편집 - 설명: 저는 유닉스 셸 스타일 와일드카드를 사용하는 모듈을 사용하여 Python으로 코딩하고 있으므로 해당 와일드카드에만 액세스할 수 있습니다.

답변1

그리고 zsh:

echo file.<->

<-><x-y>like 의 특수한 형식이지만 <1-100>제한 없이 모든 양의 십진수(비어 있지 않은 십진수 시퀀스)와 일치합니다. 또는 다음 extendedglob옵션을 사용하십시오.

echo file.[0-9]##

##+확장 정규식 연산자 와 동일합니다 .

다음 과 함께 ksh또는 bash -O extglob(또는 shopt -s extglob이내 bash) 또는 zsh -o kshglob(또는 setopt kshglob이내 zsh):

echo file.+([0-9])

다시 말하지만, +(x)ERE 와 같습니다 x+.

ksh93또한 해당 glob에서 ERE를 사용할 수도 있습니다.

echo ~(E).*\.[0-9]+$

( .*꼭 필요한 것은 아니며, 이 기능이 없으면 ~(E)\.[0-9]+$숨겨진 파일도 일치됩니다.)

표준 글로브에 해당하는 것은 없습니다. 그들이 가진 것은 다음과 같습니다.

  • *원하는 수의 문자와 일치
  • ?단일 문자와 일치
  • [criteria]일치하는 문자와 일치기준.

목록을 사후 필터링해야 합니다. 예를 들면 다음과 같습니다.

set -- *.*[0-9]
for i do
  case ${i##*.} in
    (*[!0-9]*) ;;
    (*) set -- "$@" "$i"
  esac
  shift
done
echo "$@"

즉, a를 포함하고 숫자로 끝나는 파일 이름 목록에서 .마지막 부분에 .숫자가 아닌 파일 이름이 포함된 파일 이름을 제외합니다.

답변2

Bash에서( $f확인할 파일 이름을 포함하는 경우):

[[ "${f##*.}"  == +([0-9]) ]] && echo "Yes" || echo "No"

여기서는 "${f##*.}"마지막 확장명(마지막 점 뒤)을 선택
하고 +([0-9])숫자만 일치하는 확장된 정규식입니다.

파일 이름 목록(내부적으로 infile)을 처리하는 예제 스크립트는 다음과 같습니다.

#!/bin/bash
while read f; do
    printf 'file %-15s ----> %7s ==> ' "$f" "${f##*.}"
    if     [[ "${f##*.}"  == +([0-9]) ]]
    then   echo "Yes"
    else   echo "No"
    fi
done <"infile"

어떤 출력:

file file.1          ---->       1 ==> Yes
file file.2          ---->       2 ==> Yes
file file1.1         ---->       1 ==> Yes
file 5file2.52       ---->      52 ==> Yes
file file.25938      ---->   25938 ==> Yes
file NOT             ---->     NOT ==> No
file file1.0.ext     ---->     ext ==> No
file file4.csv       ---->     csv ==> No
file 6file5.5.2.ext  ---->     ext ==> No
file file.1s         ---->      1s ==> No

더 간단한 (UNIX) 셸을 사용하여 극복해야 할 주요 장애물은 정규식을 이해하고 실행(확장)하는 유틸리티를 찾는 것입니다.

"확장 정규 표현식"을 사용해 볼 수 있습니다 sed.

[ "$(echo "${f##*.}" | sed -nE 's/^([0-9]+)$/\1/p')" ] && echo "Yes" || echo "No"

또는 sed에서도 "기본 정규식"을 사용할 수 있습니다.

[ "$(echo "${f##*.}" | sed -n 's/^\([0-9]\{1,\}\)$/\1/p')" ] && echo "Yes" || echo "No"

또는 ( Solaris 및 기타 운영 체제 로 expr변경해야 할 수도 있음 ):\+\{1,\}

expr "${f##*.}" : '^\([0-9]\+\)$' >/dev/null && echo "Yes" || echo "No"

심지어 awk:

[ $( echo "${f##*.}" | awk '/^[0-9]+$/' ) ] && echo "Yes" || echo "No"

답변3

파이썬성냥주어진 파일 "glob" 유형 인수를 Python 정규식(re)으로 변환하는 데 사용하려는 모듈이지만 "+" 연산자를 내가 원하는 방식으로 처리하지 않습니다. re에 의해 이스케이프된 것 같습니다. escape() (내 시스템의 Python 2.6에서 fnmatch의 소스 코드를 확인하세요)

마침내,

fnmatch.filter(['file.007'], '*.[0-9]+')

하다아니요예상대로 작동하지만

fnmatch.filter(['file.7'], '*.[0-9]')

일치를 제공합니다.

비슷하게

 fnmatch.filter(['file.007'], '*.[0-9]{1,}')

아니요.

답변4

파일이 숫자로 끝나므로 *[0-9]만 사용하세요.

관련 정보