如何拆分包含字符的多行字符串””到bash中的字符串数组中?

 2019-05-06 

How to split a multi-line string containing the characters “
” into an array of strings in bash?

本问题已经有最佳答案,请猛点这里访问。

我有一个以下格式的字符串:

1
2
3
4
5
6
7
8
9
I'm
Ned
Nederlander
I'
m
Lucky
Day
I'm
Dusty
Bottoms

我想把它逐行移动到字符串数组中,以便:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ echo"${ARRAY[0]}"
I'm
Ned
Nederlander

$ echo"${ARRAY[1]}"
I'
m
Lucky
Day

$ echo"${ARRAY[2]}"
I'm
Dusty
Bottoms

但是,我遇到了字符串本身中的"字符的问题。它们在字符串中表示为两个独立的字符,反斜杠和"n",但当我尝试进行数组拆分时,它们被解释为换行符。因此,使用IFS进行典型的字符串拆分不起作用。

例如:

1
2
3
4
5
6
7
8
9
$ read -a ARRAY <<<"$STRING"
$ echo"${#ARRAY[@]}"   # print number of elements
2

$ echo"${ARRAY[0]}"
I'mnNednNederla

$ echo"${ARRAY[1]}"
der


用默认的,read内置允许逃亡的人物。截止到转弯的这一行为,使用-r期权。这是不是常常准备案例中你会找到一种在你不想要的-r使用。 </P >

1
2
3
4
5
6
7
8
9
10
11
12
13
14
string="I'm
Ned
Nederlander
I'm
Lucky
Day
I'm
Dusty
Bottoms"


arr=()
while read -r line; do
   arr+=("$line")
done <<<"$string"

为了做这个,在一号线(就像你是attempting与read -a),真的requires mapfile在bash V4或更高。 </P >

1
mapfile -t arr <<<"$string"


mapfileelegant更多的是,它是可能的,但这样做在一个(丑陋的)线与read(有用的如果你是使用一种版本的bash older比(4): </P >

1
2
IFS=$'
'
read -d '' -r -a arr <<<"$string"