我正在寻找一种从字符串中获取一些数字参数的简单方法。
考虑使用如下字符串:W400Y345655T23
。从这个字符串我需要得到:W=400
,Y=345655
和T=23
。
要检索的参数数量始终相同(示例中为3个:W
,Y
和T
)。参数名称也保持不变。但是每个数值的数字长度可能不同(我可以W10Y34T334
,但也可以W100000Y2T90
)。此外,参数以相同的顺序出现。
使用Bash,是否可以使用某种花哨的scanf
或String.Format
等效方式解决此问题?三江源
答案 0 :(得分: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
答案 1 :(得分:2)
我使用关联数组:
declare -A x
eval x=($(echo "W400Y345655T23" | sed 's/\([A-Z]\)/ [\1]=/g'))
然后直接访问变量:
echo ${x[W]}
等
答案 2 :(得分:2)
你可以尝试
$ eval $( sed 's/\([A-Z]\)/ \1=/g' <<< W400Y345655T23 )
$ echo $W $Y $T
400 345655 23
它可以按任意顺序使用任意数量的不同的单大写字母参数名称。
答案 3 :(得分: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
不同。