我正在评论这篇文章:在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