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

从Bash中的格式化字符串检索数据,bash,unix,Bash,Unix,我正在寻找一种从字符串中获取一些数字参数的简单方法 考虑使用如下字符串:W400Y345655T23。从这个字符串中我需要得到:W=400,Y=345655和T=23 要检索的参数数量始终相同(示例中为3个:W、Y和T)。参数的名称也保持不变。但是每个数值的数字长度可能不同(我可以有W10Y34T334,但也可以有W100000Y2T90)。此外,参数以相同的顺序显示 使用Bash,是否可以使用某种奇特的scanf或String.Format等效方法来解决这个问题?感谢您使用BASH正则表达式:

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

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

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

使用Bash,是否可以使用某种奇特的
scanf
String.Format
等效方法来解决这个问题?感谢您使用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
read W Y T回音$Y
345655
>回音$T
23
使用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
read W Y T回音$Y
345655
>回音$T
23

这是一个使用
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

$paste-d=这是一个使用
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

$paste-d=我会使用关联数组:

declare -A x
eval x=($(echo "W400Y345655T23" | sed 's/\([A-Z]\)/ [\1]=/g'))
然后直接访问变量:

echo ${x[W]}

等等。

我会使用关联数组:

declare -A x
eval x=($(echo "W400Y345655T23" | sed 's/\([A-Z]\)/ [\1]=/g'))
然后直接访问变量:

echo ${x[W]}
等等。

你可以试试

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

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


$eval$(sed's/\([A-Z]\)/\1=/g'是的,通过后门,但工作正常。我喜欢使用
=~
BASH\u重新匹配
,因此⁺“”“Ashish:我当然可以解释。
=~
BASH运算符用于正则表达式匹配,因此这里的
W400Y345655T23
与正则表达式匹配:
^W([0-9]*)Y([0-9]*)T([0-9]*)$
括号内的每个组都可以在一个名为
BASH\u REMATCH
的BASH数组中使用。然后,该命令回显
BASH\u REMATCH
的每个元素,该元素使用
read W Y T
读取,值在BASH变量
W、Y和T
中可用。在这里,Anubhava正在将其命令中的值存储到BASH中variables@a努巴瓦:有很多东西要向你学习。谢谢你,我的一票已经投给你了you@Andry:是的
<是的,通过后门,但是工作。我喜欢使用
=~
BASH\u重新匹配
,因此⁺“”“Ashish:我当然可以解释。
=~
BASH运算符用于正则表达式匹配,因此这里的
W400Y345655T23
与正则表达式匹配:
^W([0-9]*)Y([0-9]*)T([0-9]*)$
括号内的每个组都可以在一个名为
BASH\u REMATCH
的BASH数组中使用。然后,该命令回显
BASH\u REMATCH
的每个元素,该元素使用
read W Y T
读取,值在BASH变量
W、Y和T
中可用。在这里,Anubhava正在将其命令中的值存储到BASH中variables@a努巴瓦:有很多东西要向你学习。谢谢你,我的一票已经投给你了you@Andry:是
<参数是否以相同的顺序出现?您的
W100000Y2Y90
也有两个
Y
和否
T
,这是否正确?是的,相同的顺序,发布此详细信息…关于@fedorqui的第二个问题如何?:“还有您的
W100000Y2Y?”90
有两个
Y
和一个
T
,这对吗?“@Andry
如果变量改变位置的fedorqui”方法失败了。
?你尝试了什么?我的方法是打印出来的,而不是使用。anubhava的解决方案非常好,我真的很喜欢@damienfrancois的解决方案。总之,现在你有很多选择:)参数是否以相同的顺序出现?您的
W100000Y2Y90
也有两个
Y
和no
T
,这是否正确?是的,相同的顺序,发布此详细信息…关于@fedorqui的第二个问题如何?:“您的
W100000Y2Y90
也有两个
Y
和no
T
,这是否正确?”@Andry
如果变量发生变化将fedorqui的方法定位为失败。
??您尝试了什么?我的方法是打印出来的,而不是使用。anubhava的解决方案非常好,我非常喜欢@damienfrancois的解决方案。现在您有很多选择可以使用:)甚至比我的更短。⁺比我的还要短。⁺¹ :)