bash 从字符串中删除子字符串

bash 从字符串中删除子字符串

我有一个像 package-0.0.1.jar 这样的包名称,我需要从该字符串中删除版本信息以及以 .jar 结尾的文件。我怎样才能实现这个目标?我发现你可以使用“%”符号来剪切字符串的一部分。所以我尝试了

JNAME="package-0.0.1.jar"
CLEAN="${JNAME%-.*\.jar}"

但这似乎不起作用,因为 CLEAN 之后具有完整的 JNAME 内容。 % 符号后面的正确顺序是什么?

答案1

%带/ 的扩展#不使用正则表达式;他们使用 shell glob。仅用于-*.jar匹配版本和后缀。

CLEAN=${JNAME%-*.jar}

如果需要正则表达式,可以使用Bash 的[[ a =~ b ]]${BASH_REMATCH[…]}(尽管在本例中不需要):

if [[ $JNAME =~ ^(.+)-[^-]+\.jar$ ]]; then
    CLEAN=${BASH_REMATCH[1]}
fi

答案2

另一种方法是用于awk此目的(假设您想要的名称以破折号结尾)

CLEAN=$(printf '%s' "$JNAME" | awk -F- '{print $1}')

相关内容