정규식을 사용하여 bash의 파일 이름에서 숫자만 선택하는 방법

정규식을 사용하여 bash의 파일 이름에서 숫자만 선택하는 방법

다음 스키마 파일이 포함된 디렉터리가 있습니다.

SNAFU12.jpg
SNAFU1.jpg
SNAFU123.jpg

이 코드를 사용해 보았지만 출력이 생성되지 않았습니다.

 for f in *.jpg; do
   regex="/\d/g"
   file="f:5:6"
   if [[ $file =~ $regex ]]; then
        echo ${BASH_REMATCH[1]}
   fi
 done

내 예상 결과는 다음과 같습니다.

12
1
23

답변1

/*nix의 디렉터리 구분 기호인 두 개의 s를 일치시키려고 하는데 이를 포함하는 파일 이름이 없기 때문에 정규식 패턴이 어떤 것과도 일치하지 않습니다 . 나는 /.../g그것이 당신의 JavaScript(또는 다른) 정규식 연습에서 나온 것이라고 가정합니다. 그렇지 않습니까?

하다:

for i in *.jpg; do [[ $i =~ ([0-9]+)\.jpg$ ]] && echo "${BASH_REMATCH[1]}"; done

bash정규식은 \d문자 클래스 키워드를 지원하지 않습니다 [0-9]. 따라서 를 사용하는 것이 더 좋습니다 [0-9]. 에 의존하려면 locale문자 클래스를 사용하십시오 [:digit:].

for i in *.jpg; do [[ $i =~ ([[:digit:]]+)\.jpg$ ]] && echo "${BASH_REMATCH[1]}"; done

예:

$ for i in *.jpg; do [[ $i =~ ([0-9]+)\.jpg$ ]] && echo "${BASH_REMATCH[1]}"; done
123
12
1

답변2

ls파일이 포함된 폴더의 출력을 수정합니다 .

ls SNAFU* | sed -e 's/SNAFU\|.jpg//g'

관련 정보