array de construção de script de shell para elementos de arquivo

2

Eu tenho um arquivo chamado input_file, que contém algumas linhas. Eu preciso remover certos caracteres na linha e armazená-los em uma matriz. Então, para remover os caracteres, eu uso o comando sed e armazeno em uma variável como abaixo.

            all_values=$(sed 's/^[^.]*\. //' < input_file)
            echo "$all_values"

Ele está funcionando perfeitamente, mas eu preciso de all_values para ser uma matriz para que all_values[0] contenha a primeira linha e all_values[1] da segunda linha e assim por diante.

Como tenho um arquivo, não sei o total de elementos da matriz antes da mão. Como posso construir um array para o meu caso?

EDITAR:

Meu arquivo de entrada é como abaixo.

This is first element
This is second element
Though spaces, I should be one element
    
por Ramesh 10.02.2014 / 19:29

1 resposta

4

Você só precisa de um pouco mais de sintaxe para armazenar a saída em uma matriz

all_values=( $(sed 's/^[^.]*\. //' < input_file) )

Haverá problemas se alguma das linhas de saída contiver espaços em branco: cada palavra separada em espaço em branco será um elemento de matriz separado. Por favor, mostre alguma entrada de amostra, se for o caso.

all_values=()
while read -r line; do 
    all_values+=( "$line" )
done < <( sed 's/^[^.]*\. //' input_file )

Ou mais sucinto

mapfile -t all_values < <( sed 's/^[^.]*\. //' input_file )

mapfile é um bash embutido: veja help mapfile de um prompt do bash.

Você nem precisa de sed para isso. Se eu ler sua intenção, remova a primeira sentença de cada linha:

$ cat input_file 
Ignore me. keep me
Don't want this. Do want this

$ mapfile -t a < input_file 

$ shopt -s extglob

$ a=( "${a[@]#*([^.]). }" )

$ printf "%s\n" "${a[@]}"
keep me
Do want this
    
por 10.02.2014 / 19:36