ワイルドカード文字を使用した入力に基づいて配列内のアイテムをフィルタリングする

ワイルドカード文字を使用した入力に基づいて配列内のアイテムをフィルタリングする

コマンド出力の配列があります。

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

1つの方法は次のとおりです。

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*引用は必要ありません。

関連情報