shell 使用可变定界符拆分字符串

shell split a string using variable delimiters

我的问题很简单,但我没有设法解决:

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

-3445.51692 -7177.16664 -9945.11057

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

-3445.51692-7177.16664  -9945.11057

-3445.51692 7177.16664-9945.11057

(如果是正值,前面至少有一个白色 space)

我想将这个字符串分成三个包含每个数字的变量,例如:

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

因此,我想使用类似

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

但我不知道如何指定 "zero or more white space"。并使用“-”作为分隔符将其从最终结果中删除,而我想保留该符号。

有什么想法吗?

只需使用 sed 在每个 - 前面添加一个 space,例如:

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

在进行 IFS 拆分之前规范化输入,即任何减号都会在前面加上 space:

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

这里假设恰好有 3 个数字。超紧凑形式:

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

您可以通过先注入一个 space 来使用 read -a:

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