将带有换行符分隔的单词的字符串放入数组中

将带有换行符分隔的单词的字符串放入数组中

我目前有一个bash变量,它保存与此类似的字符串,
其中每个不同的短语由换行符分隔:

var="1st word
2nd word

4th word"

"2nd word"注意和之间有一个空格"4th word"

我想将这些短语放入数组中,将空字符串保留在第二个索引中:
arr=("1st word" "2nd word" "" "4th word")

我尝试了以下代码,但它似乎忽略了空白区域。
IFS=$'\n' read -rd '' -a arr <<<"$var"

有人碰巧有解决这个问题的方法吗?

谢谢。

答案1

您的方法的问题在于它依赖于使用IFS 空白字符(即换行符)。如中所述man bash

                       Any  character  in IFS that is not IFS whitespace,
   along with any adjacent IFS whitespace characters, delimits a field.  A
   sequence  of  IFS whitespace characters is also treated as a delimiter.

因此,无论您传递给 , 的任何选项read"$var"都已被拆分为 3 个标记,将空的第三行两侧的相邻换行符视为单个分隔符。

从 bash 版本 4.0 开始,您可以使用readarray(或其同义词mapfile)来读取整行:

$ var="1st word
2nd word

4th word"

$ readarray -t arr <<<"$var"

$ declare -p arr
declare -a arr=([0]="1st word" [1]="2nd word" [2]="" [3]="4th word")

如果您的 bash 太旧而无法提供readarray/ mapfile,那么您可以使用循环来完成:

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

$ declare -p arr
declare -a arr=([0]="1st word" [1]="2nd word" [2]="" [3]="4th word")

相关内容