在Bash中从格式化字符串中检索数据

时间:2013-11-04 10:23:26

标签: bash unix

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

考虑使用如下字符串:W400Y345655T23。从这个字符串我需要得到:W=400Y=345655T=23

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

使用Bash,是否可以使用某种花哨的scanfString.Format等效方式解决此问题?三江源

4 个答案:

答案 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

使用此解决方案,您可以拥有任意数字/字母组,也可以与WYT不同。