这是输出:
3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, h.264, 1029.1, 31, 31, 0,0,0.000000,31,31,0,0,0.000000,7,0,0,0.000000,30,1280 720,10,0,0,0.000000,30,1280 720
我尝试了两种情况:
存储在数组中
@arr=split(',',$stats); echo "statistics: $stats"
存储在变量中
echo $stats | cut -d ',' -f | read s1 echo $s1
但这两种情况都不起作用。
答案1
对于单行输入,您可以使用类似这样的内容:
IFS="," read -ra arr <<< "$foo"
演示:
$ cat t.sh
foo="3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, ..." # snipped
IFS="," read -ra arr <<< "$foo"
echo ${#arr[@]}
echo ${arr[0]}
echo ${arr[30]}
$ ./t.sh
31
3
1280 720
学分:根据bash中的分隔符分割字符串?回答者约翰内斯·绍布。也检查那里的其他答案。
答案2
您的第一个片段与 shell 语法完全不同。这是正确的 Perl 语法。
您的第二个片段使用不cut
正确;我不知道你的意图是什么。
shell 有一个内置的字符串拆分结构:当您在$somevar
不带任何引号的情况下编写时,shell 首先查找变量 的值somevar
,然后根据 指定的字符将该值拆分为单独的单词IFS
,最后将每个单词解释为一个 glob模式(文件通配符)。因此,您可以通过设置IFS
分隔符并暂时关闭通配符来分割字符串。
set -f; IFS=,
arr=($stats)
set +f; unset IFS
请注意,如果字段包含空格,则数组元素将保留该空格。如果您想分割所有空格和逗号,请设置IFS=', '
。请注意,这IFS
不是一个要分割的字符串,而是一组要分割的字符;空格或逗号将构成分隔符。此外,空白还有特殊的规则:任何由零个或多个空格组成的序列,后跟逗号,后跟零个或多个空格,将构成一个分隔符,并且任何由一个或多个空格组成的序列也将构成分隔符。
如果您只想删除字段开头或结尾处的空格,则必须逐个元素地执行此操作。
shopt -s extglob
for ((i=0; i<${#arr[@]}; i++)); do
arr[i]=${arr[i]#+( )} # strip one or more spaces at the beginning
arr[i]=${arr[i]%+( )} # strip one or more spaces at the end
done
答案3
$ set -f # turn off globbing, so as not to expand wildcards
$ arr=($(echo "$stats" | sed 's/,/ /g'))
$ echo ${arr[1]}
aac-lc