부분 문자열 일치를 사용하여 bash 배열에서 요소를 반환하는 방법은 무엇입니까?

부분 문자열 일치를 사용하여 bash 배열에서 요소를 반환하는 방법은 무엇입니까?

여러 요소가 포함된 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더 빠를 수 있습니다 .

관련 정보