【发布时间】:2016-05-18 20:49:37
【问题描述】:
如何在 bash 中提取部分字符串?假设我有一个字符串product_name_v1.2。此名称不是固定的,因为它可以更改。不过可以确定的是,字符串中会有一个版本号,格式类似于v#.#。
我想做的是从字符串中提取v1.2 和1.2。有什么建议吗?
【问题讨论】:
如何在 bash 中提取部分字符串?假设我有一个字符串product_name_v1.2。此名称不是固定的,因为它可以更改。不过可以确定的是,字符串中会有一个版本号,格式类似于v#.#。
我想做的是从字符串中提取v1.2 和1.2。有什么建议吗?
【问题讨论】:
假设你想从字符串中提取数字和点:
input="product_name_v1.2_more_stuff_here"
echo "${input//[^0-9.]/}"
1.2
【讨论】:
var=product_name_v1.2
#from the beginning strip (#) longest (##) glob ending in v (*v)
echo "${var##*v}
Bash 也有正则表达式匹配([[ 和 =~),但 basic string manipulation 应该足以满足您的用例。
(您也可以查看bash(1)了解更多信息)。
【讨论】:
在任何 POSIX shell 中,这都很简单:
str=product_name_v1.2
version=${str##*_v}
echo $version
#=> 1.2
${name##pattern} 的构造删除了参数 $name 的内容中与 glob 匹配的最长前缀 pattern,只留下后面的内容。
【讨论】:
您可以使用多种标准工具,例如:
expr product_name_v1.2 : 'product_name_\(.*\)'expr product_name_v1.2 : '.*_\(v.*\)'echo product_name_v1.2 | sed -ne's/^.*_\(v[0-9.]\+\)$/\1/p'选择主要取决于匹配的复杂程度。 expr 仅支持有限的锚定正则表达式匹配,在上面的示例中就足够了。
【讨论】: