39

これが私のbash配列を作成する方法です:

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

ファイル「lines.txt」は、次の文字列で構成されています

hello big world!
how are you
where am I

の作成後${myarr[@]}、この配列発行のすべての要素 (行) に簡単にアクセスできます

echo ${myarr[2]}

しかし、単に抽出したい場合はどうすればよいworld!でしょうか? world!の 0 要素から抽出することは可能myarrですか? 最も重要なことは、myarr要素から最後の単語を抽出することは可能ですか?

Pythonでできることは知っていますが、それでうまくmyarr[0][3]いくでしょう。bashはどうですか?

4

4 に答える 4

42

これは多くの方法の 1 つです

set ${myarr[2]}
echo $3
于 2013-03-28T15:33:24.287 に答える
19

変数展開で修飾子を使用して、文字列 (配列要素と同じ) から単語を抽出できます: #(プレフィックスを削除)、##(プレフィックスを削除、貪欲)、%(サフィックスを削除)、および%%(サフィックスを削除、貪欲)。

$ 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 の配列への変換の提案がはるかに簡単になります。また、2 番目の etc 単語を抽出するために私が提案する式は少し壊れやすいです: 私の式を使用して 2 つの単語しかない文字列の 3 番目の単語を抽出すると、最初のトリムは失敗し、空白の代わりに最初の (!) 単語。また、2 つのスペースが連続している場合は、両側にスペースがある長さ 0 の単語として扱われます...

+=(newelement)ところで、配列を作成するときは、配列インデックスを明示的に追跡するよりも、使用する方が少しきれいだと思います。

myarr=()
while read line, do
    myarr+=("$line")
done < lines.txt
于 2013-03-28T20:33:24.227 に答える