如何在bash中的连字符后提取文本

时间:2018-09-08 19:25:16

标签: string bash

我有一个字符串:dev/2.0dev/2.0-tymlez。如何在bash中最后一个-连字符后提取字符串?如果没有-,则变量应为空,否则为tymlez,我想将结果存储在$STRING中。之后,我想用以下方法检查变量:

if [ -z "$STRING" ]
then
      echo "\$STRING is empty"
else
      echo "\$STRING is NOT empty"
fi

有可能吗?

3 个答案:

答案 0 :(得分:1)

建议不要调用变量STRING。所有大写变量都由系统(例如HOME)或shell本身(例如PWDRANDOM)使用。

也就是说,你可以做类似的事情

string='dev/2.0-tymlez'

case "$string" in
    *-*) string="${string##*-}";;
    *)   string='';;
esac

这有点笨拙:它首先检查是否有-,如果有,它会删除匹配*-的最长前缀;否则,它将string设置为空(因为*-届时将不匹配任何内容)。

答案 1 :(得分:1)

您可以使用=~运算符:

string="dev/2.0-tymlez"

[[ $string =~ -([^-]+)$ ]]; string=${BASH_REMATCH[1]}

BASH_REMATCH是一个特殊的数组,其中[[ ... =~ ... ]]中的匹配项被分配给该数组。

答案 2 :(得分:0)

您可以使用sed

for string in "dev/2.0" "dev/2.0-1-2-3" "dev/2.0-tymlez"; do 
   string=$(sed 's/[^-]*[-]*//' <<< "${string}")
   echo "string=[${string}]"
done

结果

string=[]
string=[1-2-3]
string=[tymlez]