bash 脚本 - 从字符串末尾删除尾随字符

bash scripting - removing trailing chars from the end of a string

我有一个这样的字符串:

rthbp-0.0.3-sources.jar

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

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

我正在这样做 - echo ${f:6} 但只给我 0.0.3-sources.jar

我建议为此使用 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

您可以使用read内置的:

s='rthbp-0.0.3-sources.jar'
IFS=- read a ver _ <<< "$s" && echo "$ver"
0.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%%-*}

或者正如其他人提到的那样,您可以呼叫 cutawk 为您进行拆分..

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

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

(您可能需要稍微更通用的正则表达式;这只是演示如何匹配包含捕获组的正则表达式以及如何提取捕获的值。)

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

$ echo "rthbp-0.0.3-sources.jar"|grep -e '([[:digit:]]+\.)+[[:digit:]]+' -oP
0.0.3
echo "rthbp-0.0.3-sources.jar" | awk -F- '=="0.0.3"{print }'
0.0.3


echo "rthbp-0.0.3-sources.jar" | awk -F- '{print }'
0.0.3