如何在bash中提取字符串的一部分?
如何在bash中提取字符串的一部分?假设我有一个字符串如何在bash中提取字符串的一部分?,bash,shell,sh,Bash,Shell,Sh,如何在bash中提取字符串的一部分?假设我有一个字符串product\u name\u v1.2。此名称不是固定的,因为它可以更改。但是有一点是肯定的,字符串中会有一个版本号,格式类似于v. 我要做的是从字符串中提取v1.2和1.2。有什么建议吗?您可以使用几种标准工具,例如: expr product\u name\u v1.2:“产品名称”(.*)” expr product\u name\u v1.2:“.*(v.*)” echo product\u name\u v1.2 | sed-
product\u name\u v1.2
。此名称不是固定的,因为它可以更改。但是有一点是肯定的,字符串中会有一个版本号,格式类似于v.
我要做的是从字符串中提取
v1.2
和1.2
。有什么建议吗?您可以使用几种标准工具,例如:
expr product\u name\u v1.2:“产品名称”(.*)”
expr product\u name\u v1.2:“.*(v.*)”
echo product\u name\u v1.2 | sed-ne的/^..*\(v[0-9.]\+\)$/\1/p'
选择主要取决于比赛的复杂程度
expr
仅支持有限的锚定正则表达式匹配,在上面的示例中就足够了。您可以使用几种标准工具,例如:
var=product_name_v1.2
#from the beginning strip (#) longest (##) glob ending in v (*v)
echo "${var##*v}
expr product\u name\u v1.2:“产品名称”(.*)”
expr product\u name\u v1.2:“.*(v.*)”
echo product\u name\u v1.2 | sed-ne的/^..*\(v[0-9.]\+\)$/\1/p'
expr
仅支持有限的锚定正则表达式匹配,在上面的示例中就足够了
var=product_name_v1.2
#from the beginning strip (#) longest (##) glob ending in v (*v)
echo "${var##*v}
Bash也有regexp匹配(与[[
和=~
匹配),但对于您的用例来说应该足够了
(您也可以查看以了解更多信息)
Bash也有regexp匹配(与[[
和=~
匹配),但对于您的用例来说应该足够了
(您还可以查看更多信息)。在任何POSIX shell中,这都很简单:
str=product_name_v1.2
version=${str##*_v}
echo $version
#=> 1.2
结构
${
名称##
模式}
删除了与glob模式匹配的参数$
名称内容的最长前缀,只留下后面的内容。在任何POSIX shell中,这很简单:
str=product_name_v1.2
version=${str##*_v}
echo $version
#=> 1.2
结构
${
名称##
模式}
删除与全局模式匹配的参数$
名称内容中最长的前缀,只保留其后面的内容。假设要从字符串中提取数字和点:
input="product_name_v1.2_more_stuff_here"
echo "${input//[^0-9.]/}"
1.2
假设要从字符串中提取数字和点:
input="product_name_v1.2_more_stuff_here"
echo "${input//[^0-9.]/}"
1.2
不只是bash;这是兼容POSIX sh的。请参阅谢谢@charlesduff.Updated。不只是bash;这是兼容POSIX sh的。请参阅谢谢@charlesduff.Updated。