根据文件:
${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
怎么了?
1条答案
按热度按时间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:
.而extglob方法看起来像: