2017-04-10 7 views
0

レッツは、私はこのようになりますアレー持っていると言う:bashで最初の文字ずつ配列から新しい配列を作成

array=("aaa" "bbb" "ccc" "ddd" "eee" "fff")

を、私はで始まるものと二つに配列を分割したいです、 bまたはcを1つの配列に、d、e、およびfを別の配列に格納します。

最初の文字の文字の範囲に基づいて新しい配列を作成するにはどうすればよいですか?

答えて

3

は、私はそのような何かをするだろう:

array=("aaa" "bbb" "ccc" "ddd" "eee" "fff") 
a1=() 
a2=() 
for v in "${array[@]}" 
do 
    if [[ "$v" =~ ^[abc] ]] 
    then 
    a1+=("$v") 
    else 
    a2+=("$v") 
    fi 
done 

は、あなたのニーズに合わせて、正規表現^[abc]を変更することができます。この正規表現は、 "テキストがaまたはbまたはcで始まるかどうか"を示します。

あなたが埋めるために、いくつかの配列を持っている場合もcaseステートメントを使用することがありますが、単純な条件の多くを持っている場合

array=("aaa" "bbb" "ccc" "ddd" "eee" "fff") 
a1=() 
a2=() 
for v in "${array[@]}" 
do 
    case "$v" in 
    a*|b*|c*) 
     a1+=("$v") 
     ;; 
    d*|e*|f*) 
     a2+=("$v") 
     ;; 
    *) 
     printf -- "Unknown value: %s\n" "$v" >&2 
     ;; 
    esac 
done 

caseステートメントが優れています。 regexがcaseのものよりもはるかに強力な条件範囲を提供するので、複雑な条件がある場合は、ifの正規表現を使用する方が良いでしょう。

PS。あなたの値に空白が含まれている場合には、必要に応じて引用符を使用してください。

+0

'a1 + =($ v)'はもっときれいに見える – klashxx

+0

@klashxxチップのThx。しかし、 '$ v'に空白があると配列にいくつかのエントリが追加されるので注意してください(注:' $ {#a [@]} = $ v'を使っても1つのエントリが追加されます)引用符なし)。 – vdavid

関連する問題