Lê elementos de matriz citados com espaços do arquivo?

4

Estou passando dados de STDIN para uma matriz usando read da seguinte forma:

prompt$ cat myfile
a "bc" "d e" f
prompt$ read -a arr < myfile

Mas read não parece prestar atenção nas strings citadas e fornece uma matriz de cinco elementos:

prompt$ echo ${#arr[@]}
5
prompt$ echo ${arr[@]:0}
a "bc" "d e" f
prompt$ echo ${arr[2]}
"d
prompt$ echo ${arr[3]}
e"

Estou usando a configuração padrão IFS : \t\n in bash . Existem várias maneiras de realizar tarefas usando diferentes ferramentas, mas estou surpreso que a leitura não suporta strings entre aspas.

Alguma outra sugestão para obter uma lista delimitada com aspas em uma matriz?

    
por Mr. Dave 21.10.2015 / 21:26

2 respostas

3

Eu não consigo pensar em uma maneira muito boa de fazer o que você está pedindo, mas se você souber que seu arquivo de entrada conterá espaços separados tokens que são sintaxe válida para bash, então algo como o seguinte poderia funcionar:

declare -a arr="($(<myfile))"
    
por 21.10.2015 / 21:43
4

Use isto:

IFS=$'\n' arr=( $(xargs -n1 <file) )
  • IFS=$'\n' define o separador de campo interno bashs como nova linha.
  • arr=( ... ) a definição da matriz.
  • xargs -n1 <file xargs lê o file com um máximo de 1 argumento. A string entre aspas fica junto, porque elas são lidas como argumentos.

A saída (um elemento por linha):

$ printf "%s\n" "${arr[@]}"
a
bc
d e
f
    
por 21.10.2015 / 21:58