您可以使用变量扩展中的修饰符从字符串(即数组元素的含义)中提取单词:(#
删除前缀)、##
(删除前缀,贪婪)、%
(删除后缀)和%%
(删除后缀,贪婪)。
$ 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!
正如您所看到的,您可以在这里变得相当花哨,但在某些时候@chepner 将其转换为数组的建议变得容易得多。此外,我建议用于提取第二个 etc 单词的公式有点脆弱:如果您使用我的公式来提取只有两个单词的字符串的第三个单词,第一次修剪将失败,并且最终会打印第一个(!)单词而不是空格。此外,如果您连续有两个空格,这会将其视为一个长度为零的单词,每边都有一个空格......
顺便说一句,在构建数组时,我认为它使用起来更简洁,+=(newelement)
而不是显式地跟踪数组索引:
myarr=()
while read line, do
myarr+=("$line")
done < lines.txt