bkpIFS="$IFS"
IFS=',()][' read -r -a array <<<"(5,[a,b,c,d,e,f,g,h,i,j])"
echo ${array[@]} ##Or printf "%s\n" ${array[@]}
5 a b c d e f g h i j
IFS="$bkpIFS"
Explicações:
- Primeiramente, estamos fazendo backup de IFS de shell padrão / atual com
bkpIFS="$IFS"; -
Em seguida, definimos o IFS como o conjunto de delimitadores
,,(,),]e[comIFS=',()][', o que significa que nossa sequência de entrada pode ser delimitada com um ou dois mais desses delimitadores. -
Próximo
read -r -a arraylê e divide a linha em uma matriz chamadaarrayapenas com base no IFS definido acima da cadeia de entrada passada em ". A opção-ré usada para informar que o comandoreadnão faz expansão na barra invertida\se entrar na entrada.IFS=',()][' read -a array <<<"(5,[a,b,c,d,e,f,g,h,i,j,\,k])" echo ${array[@]} 5 a b c d e f g h i j ,kveja o último
,kcausado por ter uma barra invertida na entrada ereadsem a opção-r. -
Com
echo ${array[@]}, estamos imprimindo todos os elementos da matriz. veja Qual é a diferença entre $ * e $ @? e Gilles's answer about${array[@]}there com mais detalhes. -
Com
printf "%s\n" ${array[@]}também existe outra abordagem para imprimir elementos de matriz. -
Agora você pode imprimir um elemento específico da matriz com
printf "%s\n" ${array[INDEX]}ou mesmo comecho ${array[INDEX]}. -
Ah, desculpe, esqueci de dar
IFSde volta ao shell,IFS="$bkpIFS":)
Ou usando awk e sua função split .
awk '{split($0,arr,/[][,)(]/)}
END{for (x in arr) printf ("%s ",arr[x]);printf "\n"}' <<<"(5,[a,b,c,d,e,f,g,h,i,j])"
Explicações:
-
O mesmo aqui, estamos dividindo toda a linha de entrada com base no grupo definido de delimitadores
[...]na constante de regexp/[...]/, que suporta na implementação moderna da funçãoawkusingsplit. leia mais na seção desplit()function. -
Em seguida, na coluna
END{for (x in arr) printf ("%s ",arr[x]); ...}, estamos passando por um array chamadoarre imprimimos o valor correspondente.xaqui aponta para o índice da matrizarrelements. leia mais sobre as regras de BEGIN / END doawk.
Redirecionamento lateral para Como adicionar / remover um elemento na matriz no bash? .