Można wyodrębnić słowa z ciągu (co właśnie elementy tablicy są) z zastosowaniem modyfikatorów w zmiennej ekspansji: #
(usunąć przedrostek), ##
(usunąć prefiks , chciwy), %
(usuń sufiks) i %%
(usuń sufiks, chciwy).
$ 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!
Jak widać, można uzyskać dość wyszukanego, ale w pewnym momencie sugestią @ chepner dnia przekształcając go w tablicy dostaje dużo łatwiejsze. Również formuły, które proponuję wyodrębnić drugie słowo itd., Są nieco delikatne: jeśli użyjesz mojej formuły do wyodrębnienia trzeciego słowa ciągu, który ma tylko dwa słowa, pierwsze przycięcie zakończy się niepowodzeniem i zakończy drukowanie pierwsze (!) słowo zamiast spacji. Ponadto, jeśli masz dwa spacje z rzędu, potraktuje to jako słowo o zerowej długości z spacją po każdej jego stronie ...
Przy okazji, podczas budowania tablicy uważam ją za nieco czystszą w użyciu +=(newelement)
zamiast bezpośredniego śledzenia indeksu tablicy:
myarr=()
while read line, do
myarr+=("$line")
done < lines.txt
Elementy tablicy to ciągi - kopie wierszy. Nie sami są tablicami słów lub czymkolwiek. Możesz podzielić element tablicy, jeśli chcesz, ale nie ma automatycznego dzielenia elementu tablicy na słowa. –
tak, to ma sens – minerals