2010-04-05 14 views
9

Sto provando ad assegnare un risultato di espressione regolare a un array all'interno di uno script di bash, ma non sono sicuro che sia possibile, o se lo sto facendo completamente sbagliato. Il sotto è quello che voglio che accada, ma so che la mia sintassi non è corretta:bash: assegna i risultati regex di grep all'array

indexes[4]=$(echo b5f1e7bfc2439c621353d1ce0629fb8b | grep -o '[a-f0-9]\{8\}') 

tale che:

index[1]=b5f1e7bf 
index[2]=c2439c62 
index[3]=1353d1ce 
index[4]=0629fb8b 

Tutti i link, o consigli, sarebbe meraviglioso :)

risposta

27

qui

array=($(echo b5f1e7bfc2439c621353d1ce0629fb8b | grep -o '[a-f0-9]\{8\}')) 
$ echo ${array[@]} 
b5f1e7bf c2439c62 1353d1ce 0629fb8b 
+0

meravigliosa - esattamente quello che mi serviva - grazie !!! – Ryan

2

ecco un modo bash pura, senza comandi esterni necessari

#!/bin/bash 
declare -a array 
s="b5f1e7bfc2439c621353d1ce0629fb8b" 
for((i=0;i<=${#s};i+=8)) 
do 
array=(${array[@]} ${s:$i:8}) 
done 
echo ${array[@]} 

uscita

$ ./shell.sh 
b5f1e7bf c2439c62 1353d1ce 0629fb8b 
4
#!/bin/bash 
# Bash >= 3.2 
hexstring="b5f1e7bfc2439c621353d1ce0629fb8b" 
# build a regex to get four groups of eight hex digits 
for i in {1..4} 
do 
    regex+='([[:xdigit:]]{8})' 
done 
[[ $hexstring =~ $regex ]]  # match the regex 
array=(${BASH_REMATCH[@]})  # copy the match array which is readonly 
unset array[0]     # so we can eliminate the full match and only use the parenthesized captured matches 
for i in "${array[@]}" 
do 
    echo "$i" 
done