用extglob做参数前缀或后缀删除的麻烦

时间:2014-08-07 16:32:44

标签: bash cygwin

我试图在bash脚本中直接从超级字符串的中间拉出一个正则表达式子字符串,没有 fork / execing到grep(或其他东西)。为此,我想使用shell参数扩展来删除不需要的前缀,然后从超级字符串中删除不需要的后缀。但前缀和后缀也接近正则表达式,所以我试图启用extglob并执行类似的操作(在Cygwin下):

$ echo $BASH_VERSION
4.1.10(4)-release
$ shopt -s extglob
$ foo=foobar
$ echo $foo
foobar
$ echo ${foo#fo}   #simple prefix removal works as expected
obar
$ echo ${foo/!(FO)/SUB}   #substitution using extglob works
SUB
$ echo ${foo#!(FO)}
foobar
$ echo ${foo##!(FO)}
<nothing>
$ echo ${foo%ar}   #simple suffix removal works as expected
foob
$ echo ${foo%!(AR)}
foobar
$ echo ${foo%%!(AR)}
<nothing>

当extglob可以解释前缀和后缀删除的结果!使用语法?这是一个bash bug吗? (如果我能弄清楚这一点,那么我会尝试比“FO”和“AR”更复杂的模式。)

2 个答案:

答案 0 :(得分:1)

${foo%!(AR)}表示&#34;删除非AR&#34;的最短后缀。最短的后缀是空字符串。

${foo%%!(AR)}表示&#34;删除不是AR&#34;的最长后缀。在&#34; foobar&#34;的情况下,它会删除所有内容。要获得更有趣的结果,请尝试:

$ echo ${foo%%!(foobar)}
f
$ echo ${foo%%!(*bar)}
foob

答案 1 :(得分:0)

%%删除最长匹配后缀。由于foobar是匹配&#34;而不是AR&#34;的最长前缀,因此整个字符串都被删除。