读取带空格的数组

时间:2012-10-16 23:30:24

标签: arrays bash

说我有文件foo.txt

"The" "quick brown" "fox" "jumps over" "the" "lazy dog."

我想将这些“字段”从文件读入数组。但是,如果字段有空格

,则我的尝试失败
$ read -a bar < foo.txt

$ echo ${bar[0]}
"The"

$ echo ${bar[1]}
"quick

4 个答案:

答案 0 :(得分:5)

使用declare代替eval

declare -a "bar=( $( < foo.txt ) )"

这会强制将文件中的所有内容视为赋值的右侧。使用eval,文件的内容可以解释为代码。例如,如果文件包含

Some text ); echo "you just erased all your files"; ( true

然后由eval执行以下内容:

bar=( Some text ); echo "you just erased all your files"; ( true )

文件中的括号平衡在命令替换之外使用的括号,导致文件中它们之间的文本作为代码执行,而不是用于填充数组。

答案 1 :(得分:1)

这有效

$ read < foo.txt

$ eval bar=($REPLY)

$ echo ${bar[0]}
The

$ echo ${bar[1]}
quick brown

答案 2 :(得分:0)

您的解决方案失败,因为bash通常使用空格进行输入字段分隔IFS(这也是您获取引号的原因)。

如果您准备文字进行处理,则可以使用普通read

IFS='"'
read -a bar < <(sed 's/"\([^"]*\)" */\1"/g' foo.txt)
echo ${bar[1]}

quick brown

注意:sed命令将文件转换为以下格式:The"quick brown"fox"jumps over"the"lazy dog."。我使用"作为分隔符,因为它绝对不会用在单词中。

答案 3 :(得分:0)

以下是使用GNU awkFPAT变量的一种方式:

IFS=$'\n'
array=($(awk 'BEGIN { FPAT = "([^ ]+)|(\"[^\"]+\")" } { for (i=1; i<=NF; i++) print $i }' file.txt))

echo "${array[1]}"

结果:

"quick brown"