2015-09-30 223 views
0

我有一个字符串这样的:的bash脚本 - 从字符串末尾除去尾随字符

rthbp-0.0.3-sources.jar

,我希望得到一个所谓的以某种方式新的字符串(如string2)与原始字符串只有版本,所以 - '0.0.3'现在rthbp-在开始时将保持不变,但在版本“ - ”(-sources.jar)之后可能会改变。

是否可能在bash中提取版本信息?

我这样做 - 回声$ {F:6}但只给了我0.0.3-sources.jar

回答

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 

或者,有些更clunkily:

$ ltrim=${filename%%-*}- 
$ rest=${filename#$ltrim} 
$ version=${rest%%-*} 

或者像其他人所说,你可以调用出来cutawk做拆分为你..

+0

笨重代码可以简化一点:'version_and_suffix = $ {文件名#rthbp-}; version = $ {version_and_suffix %% - *}' – pjh

+0

我试图不假设我们知道文件名的第一部分,但确定。 –

1

我只想用cut这个建议。定义分隔符如破折号,并保持现场二:

$ 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 
2

可以使用read内置:

s='rthbp-0.0.3-sources.jar' 
IFS=- read a ver _ <<< "$s" && echo "$ver" 
0.0.3 
3

还没有人提到正则表达式匹配,所以我会。

[[ $string1 =~ rthbp-(.*)-sources.jar ]] 
version=${BASH_REMATCH[1]} 

(您可能要稍微更一般的正则表达式,这只是演示了如何去匹配一个正则表达式包含捕获组以及如何提取捕捉值)。

1

正则表达式匹配的另一变型:

$ echo "rthbp-0.0.3-sources.jar"|grep -e '([[:digit:]]+\.)+[[:digit:]]+' -oP 
0.0.3 
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