shell使用变量分隔符拆分字符串

时间:2015-01-30 14:47:52

标签: shell split

我的问题很简单,但我无法解决它:

我有一个看起来像这样的字符串:

-3445.51692 -7177.16664 -9945.11057

棘手的部分是每个数字之间可能有零个或多个空格,后者可能是负数或正数,这意味着字符串也可能像:

-3445.51692-7177.16664  -9945.11057

-3445.51692 7177.16664-9945.11057

(如果是正值,则至少有一个空格在前面)

我希望将此字符串拆分为三个包含每个数字的变量,例如:

a=-3445.51692
b=-7177.16664
c=-9945.11057

因此,我想使用像

这样的东西
IFS=' -' read -a array <<< "$string"

但我不知道如何指定“零个或多个空格”。并使用“ - ”作为分隔符将其从最终结果中删除,而我想保留符号。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

在进行IFS分割之前规范化输入,即任何减号都会获得前置空格:

canonicalized_string=$(echo "$string" | sed 's/-/ -/g')
set -- $canonicalized_string   # No need to mess with IFS.
a=$1
b=$2
c=$3

这假定正好是3个数字。以超紧凑的形式:

set -- $(echo "$string" | sed 's/-/ -/g')
a=$1 b=$2 c=$3

答案 1 :(得分:0)

只需使用sed添加每个-前面的空格,例如:

echo $string | sed 's/-/ -/g'

答案 2 :(得分:0)

您可以先注入空格来使用read -a

s='-3445.51692-7177.16664  -9945.11057'
IFS=' ' read -ra arr <<< "${s//-/ -}"
printf "[%s]\n" "${arr[@]}"
[-3445.51692]
[-7177.16664]
[-9945.11057]