/ / Como extrair um elemento particular de uma matriz no BASH? - arrays, bash

Como extrair um elemento particular de um array no BASH? - arrays, bash

Aqui está como eu crio meu array bash:

while read line
do
myarr[$index]=$line
index=$(($index+1))
done < lines.txt

O arquivo "lines.txt" é constituído pelas seguintes strings

hello big world!
how are you
where am I

Após a criação de ${myarr[@]} Eu posso acessar facilmente todos os elementos (linha) nesta emissão de matriz

echo ${myarr[2]}

Mas e se eu quiser extrair apenas world!? É possível extrair world! de 0 elemento do myarr? O que é mais importante, é possível extrair a última palavra do myarr elemento?

Eu sei que em python você pode fazer myarr[0][3] e isso vai fazer o truque, que tal bash?

Respostas:

8 para resposta № 1

Esta é uma das muitas maneiras

set ${myarr[2]}
echo $3

5 para resposta № 2

Você pode extrair palavras de uma string (que é o que os elementos da matriz são) usando modificadores na expansão da variável: # (remover prefixo) ## (remova o prefixo, ganancioso), % (remova o sufixo) e %% (remova o sufixo, ganancioso).

$ myarr=("hello big world!" "how are you" "where am I")
$ echo "${myarr[0]}"      # Entire first element of the array
hello big world!
$ echo "${myarr[0]##* }"  # To get the last word, remove prefix through the last space
world!
$ echo "${myarr[0]%% *}"  # To get the first word, remove suffix starting with the first space
hello
$ tmp="${myarr[0]#* }"    # The second word is harder; first remove through the first space...
$ echo "${tmp%% *}"       # ...then get the first word of what remains
big
$ tmp="${myarr[0]#* * }"  # The third word (which might not be the last)? remove through the second space...
$ echo "${tmp%% *}"       # ...then the first word again
world!

Como você pode ver, você pode ficar bastante chique aqui,mas em algum momento a sugestão de @chepner de transformá-lo em array fica muito mais fácil. Além disso, as fórmulas que sugiro para extrair a segunda palavra etc. são um pouco frágeis: se você usar minha fórmula para extrair a terceira palavra de uma string só tem duas palavras, o primeiro trim irá falhar, e vai acabar imprimindo a primeira palavra (!) em vez de um espaço em branco. Além disso, se você tiver dois espaços em uma linha, isso a tratará como uma palavra de comprimento zero com um espaço em cada lado dela ...

BTW, ao construir o array eu considero um pouco mais limpo de usar +=(newelement) em vez de acompanhar explicitamente o índice da matriz:

myarr=()
while read line, do
myarr+=("$line")
done < lines.txt