2017-04-10 42 views
0

让说我有一个数组,看起来像这样:按首字母bash中创建一个数组新的阵列

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

,我想在阵列那些带有开始分裂成两个, b或c在一个数组中,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语句是更好,如果你有很多简单的条件。如果你的条件比较复杂,那么使用正则表达式的if s会更好,因为正则表达式提供的条件范围比case的条件要强得多。

PS。如果您的值包含空格,请确保在需要的地方使用引号。

+0

'A1 + =($ V)'似乎用于顶端更整齐 – klashxx

+0

@klashxx THX。但是,我添加了引号,因为如果'$ v'有空格,它会向数组中添加几个条目(注意:它会使用'a [$ {#a [@]}] = $ v'添加一个单独的条目不含引号)。 – vdavid