2013-03-28 14 views
8

Oto jak tworzę tablicę bash:Jak wyodrębnić określony element z tablicy w BASH?

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

plik „lines.txt” constists następujących ciągów

hello big world! 
how are you 
where am I 

Po stworzeniu ${myarr[@]} można łatwo uzyskać dostęp do każdego elementu (linii) w tej tablicy wydawanie

echo ${myarr[2]} 

Ale co jeśli chcę wyodrębnić tylko world!? Czy jest możliwe wyodrębnienie world! z elementu 0 z myarr? Co jest najważniejsze, czy możliwe jest wyodrębnienie ostatniego słowa z elementu myarr?

Wiem, że w python można zrobić myarr[0][3] i to wystarczy, bash?

+0

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. –

+0

tak, to ma sens – minerals

Odpowiedz

6

Jest to jeden z wielu sposobów

set ${myarr[2]} 
echo $3 
+1

Polecenie: 'set - $ {mayarr [2]}' tak, że jeśli wartość w elemencie tablicy to '-x -e', to powłoka nie rozpocznie śledzenia i nie zakończy błędów. –

+5

'a = ($ {myarr [2]}); echo $ {a [3]} 'jest równoważne i nie zastępuje parametrów pozycyjnych powłoki/funkcji, które mogą być używane do czegoś innego. – chepner

5

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 
Powiązane problemy