여러 요소가 포함된 bash 배열이 있는데 그 중 하나만 nn.wr 형식입니다. 여기서 nn은 변경 가능한 정수입니다.
예를 들어
array=( "abcd" "01.wr" "ef_gh" )
하지만 배열의 어느 곳에나 위치할 수 있습니다. 어떻게 찾아서 반납할 수 있나요? 부분 일치 *.wr을 사용하려고 하는데 sed나 awk를 사용할 수 없습니다.
분명 방법이 있을 거예요! !
답변1
sed
또는 같은 외부 명령이 필요하지 않습니다 awk
. 요소를 반복하고 패턴 일치를 사용합니다.
#! /bin/bash
array=( "abcd" "01.wr" "ef_gh" )
unset found
for e in "${array[@]}" ; do
if [[ $e == +([0-9]).wr ]] ; then
found=$e
break
fi
done
[[ $found ]] && echo "$found"
답변2
zsh
내장된 연산자를 사용하여 옵션 으로 전환할 수 있습니다 .
array=( "abcd" "01.wr" "ef_gh" xx.wr 99.wr )
첫 번째
$ print -rC1 -- $array[(r)[0-9][0-9].wr] 01.wr
마지막
$ print -rC1 -- $array[(R)[0-9][0-9].wr] 99.wr
첫 번째 인덱스 1:
$ print $array[(i)[0-9][0-9].wr] 2
마지막 색인²:
$ print $array[(I)[0-9][0-9].wr] 5
모두
$ print -rC1 -- ${(M)array:#[0-9][0-9].wr} 01.wr 99.wr
1 찾을 수 없으면 마지막 요소의 인덱스보다 1 큰 값을 반환합니다.
² 찾을 수 없으면 0을 반환합니다.
답변3
구성 요소에 개행 문자가 포함되어 있지 않으면 다음을 수행할 수 있습니다.
array=( "abcd" "01.wr" "ef_gh" )
printf "%s\n" "${array[@]}" | grep -E '^[[:digit:]]+\.wr$'
결과
01.wr
grep
줄바꿈이 포함된 경우 비표준 확장을 사용할 수 있습니다.
array=( "abcd" "01.wr" $'44.zz\n9.p' "ef_gh" )
printf "%s\0" "${array[@]}" | grep -Exz '[[:digit:]]+\.wr'
결과
01.wr
짧은 배열의 경우 더 효율적입니다.그것을 통해 루프. 대규모 배열의 경우 외부 연산자를 사용하는 것이 grep
더 빠를 수 있습니다 .