Como selecionar a primeira palavra de cada linha e atribuí-la a uma matriz em um script bash

0

Eu gostaria de criar um script bash que seleciona a primeira palavra de cada linha a partir de um arquivo de texto antes do caractere ":" e gera a saída em uma matriz (1 slot para 1 linha).

Agora eu tenho isso:

while read p; 
do
  arr+=$p | sed -r 's///'
done <test.txt

e eu não consigo descobrir o que colocar na condição do sed.

Eu tenho esse regexep:

/^([^:])+/gm
    
por ndfg201 01.05.2018 / 23:57

2 respostas

2

Não há necessidade de um subshell e sed, apenas use a expansão de parâmetros:

while read p ; do
  arr+=( "${p%%:*}" )
done < test.txt

Pode ser mais rápido remover todas as substrings em um comando

while read p ; do
    arr+=("$p")
done < test.txt
arr=("${arr[@]%%:*}")
    
por 02.05.2018 / 00:07
0

Com bash 4 ou posterior, você pode usar readarray para ler diretamente em uma matriz:

readarray -t arr < <( awk -F ':' '{ print $1 }' file.in )

O código awk é executado em uma substituição de processo e fornece os dados. Ele simplesmente extrai o primeiro campo de cada linha : -dimimitada.

Exemplo com file.in as

roses are:red
violets:are blue
sugar is:sweet and
so:are
you:.
$ readarray -t arr < <( awk -F ':' '{ print $1 }' file.in )
$ printf '"%s"\n' "${arr[@]}"
"roses are"
"violets"
"sugar is"
"so"
"you"
    
por 05.05.2018 / 20:44