와일드카드 문자를 사용한 입력을 기반으로 배열의 항목 필터링

와일드카드 문자를 사용한 입력을 기반으로 배열의 항목 필터링

명령 출력의 배열이 있습니다.

array=(saf sri trip tata strokes)

이제 사용자 입력을 기반으로 항목을 필터링하고 싶습니다. 사용자는 와일드카드를 사용할 수도 있으므로 사용자가 를 입력하면 *tr*출력은 다음과 같아야 합니다.

trip strokes

답변1

다음을 사용하는 것이 더 쉽습니다 zsh.

$ array=(saf sri trip tata strokes)
$ pattern='*tr*'
$ printf '%s\n' ${(M)array:#$~pattern}
trip
strokes
  • ${array:#pattern}: 배열의 요소로 확장됩니다.아니요패턴을 일치시킵니다.
  • (M):#(일치의 경우): 일치하는 요소로 확장된 연산자의 의미를 복원합니다.
  • $~pattern, 결과 콘텐츠는 $pattern패턴으로 처리됩니다.

답변2

한 가지 방법은 다음과 같습니다.

array=(saf sri trip tata strokes)                      
input=*tr*
for foo in "${array[@]}"; do
    case "$foo" in
        $input) printf '%s\n' "$foo" ;;
    esac
done

지나치게 열정적으로 인용하는 사람을 위한 참고 사항: 과제의 오른쪽(예: *tr*) 에는 input=*tr*인용이 필요하지 않습니다.

관련 정보