说我有文件 foo.txt
"The" "quick brown" "fox" "jumps over" "the" "lazy dog."
我想将文件中的这些“字段”读入数组。但是,如果该字段有空格,我的尝试就会失败
$ read -a bar < foo.txt
$ echo ${bar[0]}
"The"
$ echo ${bar[1]}
"quick
我看到答案建议更改
IFS
,但这是一行,因此似乎无济于事。 最佳答案
这是一个可以完成这项工作的函数。对于大字符串,它可能会很慢,但可以正常工作,没有任意代码执行或路径名扩展之类的警告:
#!/bin/bash
parse_quoted_items() {
# Return array is parse_quoted_items_ary
local line=$1
parse_quoted_items_ary=() parse_quoted_items_error=
while [[ $line ]]; do
if [[ $line =~ ^[[:space:]]*\"([^\"]*)\"([[:space:]]+.+|)[[:space:]]*$ ]]; then
parse_quoted_items_ary+=( "${BASH_REMATCH[1]}" )
line=${BASH_REMATCH[2]}
else
parse_quoted_items_error=$line
return 1
fi
done
}
然后你可以使用作为
IFS= read -r line < foo.txt
if parse_quoted_items "$line"; do
declare -p parse_quoted_items_ary
else
printf >&2 "There was an error parsing the string at %s\n" "$parse quoted_items_error"
exit 1
fi
这不是一个令人满意的答案,但我怀疑是否有任何(安全)方法不明确解析字符串。
关于arrays - 将带空格的引用项读入数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12924909/