从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
和noT
,这是否正确?是的,相同的顺序,发布此详细信息…关于@fedorqui的第二个问题如何?:“您的W100000Y2Y90
也有两个Y
和noT
,这是否正确?”@Andry如果变量发生变化将fedorqui的方法定位为失败。
??您尝试了什么?我的方法是打印出来的,而不是使用。anubhava的解决方案非常好,我非常喜欢@damienfrancois的解决方案。现在您有很多选择可以使用:)甚至比我的更短。⁺比我的还要短。⁺¹ :)