在 Bash 中将一个字符串拆分为另一个字符串或子字符串

在 Bash 中将一个字符串拆分为另一个字符串或子字符串

我正在评论这篇文章:在bash中用一些分隔符分割字符串?

在我的场景中,我尝试仅使用 Bash 来完成此操作,但我遇到了一些奇怪的行为。

shopt -s extglob
export var=abc_def__123__456
echo ${var/%__*}
echo ${var/#!(__)__}
shopt -u extglob

第一个echo是按预期工作并输出abc_def。我期待第二个echo输出123__456,但它输出456.这不是我正在阅读的方式手册,其中说:

如果图案前面有“#”(上面的第三种形式),它必须匹配扩展值的开头范围

对我来说,这意味着当第一次出现 时__,比赛应该停止,因此第二次echo应该返回123__456,这是所期望的。

我缺少什么?

答案1

对于任何 POSIX shell,使用标准参数扩展:

var="abc_def__123__456"
echo "${var%%__*}"
echo "${var#*__}"

输出:

abc_def
123__456

相关内容