2015-09-30 271 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