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]
我的问题很简单,但我没有设法解决:
我有一个看起来像这样的字符串:
-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]