1

我正在寻找一种从字符串中获取一些数字参数的简单方法。

考虑有一个像这样的字符串:W400Y345655T23。从这个字符串我需要得到W=400:Y=345655T=23.

要检索的参数数量始终相同(示例中为 3:WYT。参数名称也保持不变。但是每个数值的数字长度可能不同(我也可以W10Y34T334W100000Y2T90。此外,参数以相同的顺序出现。

使用 Bash,是否可以使用某种奇特scanfString.Format等效的方式来解决这个问题?谢谢

4

4 回答 4

4

使用 BASH 正则表达式:

s='W400Y345655T23'
[[ "$s" =~ ^W([0-9]*)Y([0-9]*)T([0-9]*)$ ]] && echo ${BASH_REMATCH[1]}, ${BASH_REMATCH[2]}, ${BASH_REMATCH[3]}

或将值放入 BASH 变量中:

read W Y T < <([[ "$s" =~ ^W([0-9]*)Y([0-9]*)T([0-9]*)$ ]] && echo ${BASH_REMATCH[1]} ${BASH_REMATCH[2]} ${BASH_REMATCH[3]})

>echo $W
400
>echo $Y
345655
>echo $T
23
于 2013-11-04T10:27:15.223 回答
2

你可以试试

$ eval $( sed 's/\([A-Z]\)/ \1=/g' <<< W400Y345655T23 )
$ echo $W $Y $T
400 345655 23

它将以任何顺序与任意数量的不同的单大写字母参数名称一起使用。

于 2013-11-04T10:35:17.160 回答
2

我会使用关联数组:

declare -A x
eval x=($(echo "W400Y345655T23" | sed 's/\([A-Z]\)/ [\1]=/g'))

然后访问变量是直截了当的:

echo ${x[W]}

等等

于 2013-11-04T10:29:47.097 回答
1

这是grep -Po用于匹配数字和字符的解决方法:

$ echo "W400Y345655T23" | grep -Po '\d*'
400
345655
23

$ echo "W400Y345655T23" | grep -Po '[A-Z]*'
W
Y
T

如果将这些结果保存到变量中:

c=$(echo "W400Y345655T23" | grep -Po '[A-Z]*')
d=$(echo "W400Y345655T23" | grep -Po '[0-9]*')

然后你可以在这样的列中打印:

$ paste -d= <(echo "$c") <(echo "$d")
W=400
Y=345655
T=23

有了这个解决方案,你可以有任何一组数字/字母,也可以不同于W, Y, T

于 2013-11-04T10:27:18.703 回答