![정규식을 사용하여 bash의 파일 이름에서 숫자만 선택하는 방법](https://linux55.com/image/103401/%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20bash%EC%9D%98%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%97%90%EC%84%9C%20%EC%88%AB%EC%9E%90%EB%A7%8C%20%EC%84%A0%ED%83%9D%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
다음 스키마 파일이 포함된 디렉터리가 있습니다.
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'