숫자 파일 확장자와만 일치하는 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]만 사용하세요.