说我有文件foo.txt
"The" "quick brown" "fox" "jumps over" "the" "lazy dog."
我想将这些“字段”从文件读入数组。但是,如果字段有空格
,则我的尝试失败$ read -a bar < foo.txt
$ echo ${bar[0]}
"The"
$ echo ${bar[1]}
"quick
答案 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 awk
和FPAT变量的一种方式:
IFS=$'\n'
array=($(awk 'BEGIN { FPAT = "([^ ]+)|(\"[^\"]+\")" } { for (i=1; i<=NF; i++) print $i }' file.txt))
echo "${array[1]}"
结果:
"quick brown"