shell Bash/ksh子字符串删除

eqoofvh9  于 12个月前  发布在  Shell
关注(0)|答案(1)|浏览(109)

根据文件:

${string#substring}   # strip shortest match
${string##substring}  # strip longest match

然而,在测试时,我得到:

$ string="abcABC123ABCabc"
$ echo ${string#a*C}
123ABCabc
$ echo ${string##a*C}
abc

到目前为止,工作如预期,然而.

$ echo ${string#B*c}
abcABC123ABCabc
$ echo ${string##B*c}
abcABC123ABCabc

我希望第三个echo返回abcABC123A(去掉最短的匹配),第四个返回abcA
怎么了?

rjjhvcjd

rjjhvcjd1#

${var#prefix}${var##prefix}锚定到字符串的开头。
${var%suffix}${var%%suffix}锚定到字符串的末尾。
如果你想要一个非锚定的替换,那么你应该使用${var/pattern/subst}(它可以让subst留空,如${string/a*C/}${var//pattern/subst}(它的工作方式相同,但替换pattern的 * 所有 * 示例,而不仅仅是第一个)。
如果你的目标是一个unanchored,non-greedy 的子字符串删除,你可以 * 用extglob来做,但就我个人而言,我会使用一个正则表达式来使用字符类来模拟non-greediness:

re='^(.*)(b[^C]*C)(.*)'

[[ $string =~ $re ]] && result="${BASH_REMATCH[1]}${BASH_REMATCH[3]}"`

.而extglob方法看起来像:

shopt -s extglob
result=${string/b*([^C])C/}

相关问题