部分文字列マッチングを使用してbash配列から要素を返す方法は?

部分文字列マッチングを使用してbash配列から要素を返す方法は?

いくつかの要素を含むbash配列があり、そのうちの1つだけが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高速です。

関連情報