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 array
lê e divide a linha em uma matriz chamadaarray
apenas com base no IFS definido acima da cadeia de entrada passada em ". A opção-r
é usada para informar que o comandoread
nã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 ,k
veja o último
,k
causado por ter uma barra invertida na entrada eread
sem 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
IFS
de 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çãoawk
usingsplit
. 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 chamadoarr
e imprimimos o valor correspondente.x
aqui aponta para o índice da matrizarr
elements. leia mais sobre as regras de BEGIN / END doawk
.
Redirecionamento lateral para Como adicionar / remover um elemento na matriz no bash? .