实际上,我试图在bash脚本中直接从超级字符串的中间提取regex子字符串,而不需要对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>谁能解释一下在填词时前缀和后缀移除的结果吗?使用语法了吗?是巴什虫吗?(如果我能搞清楚这一点,我就会尝试比"FO“和”AR“更复杂的模式。)
发布于 2014-08-07 16:50:14
${foo%!(AR)}的意思是“删除非AR的最短后缀”。最短的这样的后缀是空字符串。
${foo%%!(AR)}的意思是“删除最长的后缀而不是AR”。如果是"foobar",它会移除所有的东西。要获得更有趣的结果,请尝试:
$ echo ${foo%%!(foobar)}
f
$ echo ${foo%%!(*bar)}
foob发布于 2014-08-07 16:49:58
%%删除最长的匹配后缀。由于foobar是与"not“匹配的最长前缀,整个字符串将被删除。
https://stackoverflow.com/questions/25187713
复制相似问题