我有一个这样的字符串:
rthbp-0.0.3-sources.jar
我希望得到一个新的字符串(比如string2),原始字符串只包含版本,所以 - ' 0.0.3'现在rthbp-在开始时将保持不变,但在版本" - " (-sources.jar)可能会改变。
是否可以在bash中提取版本信息?
我这样做 - 回显$ {f:6}但只给我0.0.3-sources.jar
答案 0 :(得分:3)
如果您正在使用bash,则可以通过指定偏移量和长度来提取任意子字符串:
$ filename=rthbp-0.0.3-sources.jar
$ echo "${filename:6:5}"
#=> 0.0.3
但是使用这样的精确字符偏移是脆弱的。你可能想要使用这样的东西:
$ IFS=- read pre version post <<<"$filename"
$ echo "$version"
#=> 0.0.3
或者,更笨拙:
$ ltrim=${filename%%-*}-
$ rest=${filename#$ltrim}
$ version=${rest%%-*}
或者正如其他人提到的那样,您可以呼叫cut
或awk
为您进行拆分..
答案 1 :(得分:3)
还没有人提到正则表达式匹配,所以我会。
[[ $string1 =~ rthbp-(.*)-sources.jar ]]
version=${BASH_REMATCH[1]}
(您可能需要稍微更通用的正则表达式;这只是演示了如何匹配包含捕获组的正则表达式以及如何提取捕获的值。)
答案 2 :(得分:2)
您可以使用read
内置:
s='rthbp-0.0.3-sources.jar'
IFS=- read a ver _ <<< "$s" && echo "$ver"
0.0.3
答案 3 :(得分:1)
我建议您只使用cut
。将分隔符定义为破折号并保留字段2:
$ echo "rthbp-0.0.3-sources.jar" | cut -d'-' -f 2
0.0.3
如果你想使用纯粹的bash,你可以使用parameter expansion,但它并不干净。假设版本始终在同一个地方开始并且长度相同,您可以使用:
$ str="rthbp-0.0.3-sources.jar"
$ echo "${str:6:5}"
0.0.3
答案 4 :(得分:1)
正则表达式匹配的另一种变体:
$ echo "rthbp-0.0.3-sources.jar"|grep -e '([[:digit:]]+\.)+[[:digit:]]+' -oP
0.0.3
答案 5 :(得分:0)
echo "rthbp-0.0.3-sources.jar" | awk -F- '$2=="0.0.3"{print $2}'
0.0.3
echo "rthbp-0.0.3-sources.jar" | awk -F- '{print $2}'
0.0.3