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 № 1Esta é 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