欢迎光临
我们一直在努力

bash – 负参数在参数扩展中如何在extglob中工作

本站教程收集整理的这篇文章主要介绍了bash – 负参数在参数扩展中如何在extglob中工作,本站教程本站觉得挺不错的,现在分享给大家,也给大家做个参考。

问题

的行为

!(pattern-list)

特别是在参数扩展中使用时,我的工作方式不正常

${parameter/pattern/String}

输入

a="1 2 3 4 5 6 7 8 9 10"

测试用例

便宜美国vps

$printf "%s\n" "${a/!([0-9])/}"
[blank]
#expected 12 3 4 5 6 7 8 9 10

$printf "%s\n" "${a/!(2)/}"
[blank]
#expected  2 3 4 5 6 7 8 9 10

$printf "%s\n" "${a/!(*2*)/}"
2 3 4 5 6 7 8 9 10
#Produces the behavIoUr expected in prevIoUs one,not sure why though

$printf "%s\n" "${a/!(*2*)/,}",2 3 4 5 6 7 8 9 10
#Expected after prevIoUs worked

$printf "%s\n" "${a//!(*2*)/}"
2
#Expected again prevIoUs worked

$printf "%s\n" "${a//!(*2*)/,2,#Why are there 3 commas???

眼镜

GNU bash,version 4.2.46(1)-release (x86_64-redhat-linux-gnu)

笔记

这些是非常基本的例子,所以如果可以在答案中包含更复杂的例子和解释,那么请做.

更多信息或示例需要在评论中告诉我.

已经看过How does extglob work with sHell parameter expansion?了,甚至评论了这个特定问题的问题,所以请不要标记为欺骗.

解决方法

${parameter / pattern / String}形式的参数扩展(其中pattern不以/开头)的工作原理是找到与模式模式匹配的变量参数值中最左边最长的子字符串,并将其替换为字符串.换句话说,$参数被分解为三个部分前缀,匹配和后缀等

> $parameter ==“${prefix} ${match} ${suffix}”
> $prefix是最短的字符串,可以满足其他要求(即匹配,如果可能的话,发生在最左边的位置)
> $match匹配模式并且尽可能长
> $prefix,$match和/或$suffix中的任何一个都可以为空

${parameter / pattern / String}的结果是“${prefix} String ${suffix}”.

对于这种类型的参数扩展的全局替换形式(${parameter // pattern / String}),对后缀部分递归地执行相同的过程,但是a zero-length match is handled as a special case(为了防止无限递归):

> if“${prefix} ${match}”!=“”

"${parameter//pattern/String}" = "${prefix}String${suffix//pattern/String}"

else suffix = ${parameter:1}和

"${parameter//pattern/String}" = "String${parameter:0:1}${suffix}//pattern/String}"

现在让我们分析一下这些案例:

>“${a /!([0-9])/}” – > prefix =”match =’1 2 3 4 5 6 7 8 9 10’后缀=”.实际上,’1 2 3 4 5 6 7 8 9 10’不是由单个数字组成的字符串,因此它匹配模式!([0-9]).因此,扩张的空洞结果.>“${a /!(2)/}” – > prefix =”match =’1 2 3 4 5 6 7 8 9 10’后缀=”.与上述类似,’1 2 3 4 5 6 7 8 9 10’不是由单个字符’2’组成的字符串,因此它与模式匹配!(2).因此,扩张的空洞结果.>“${a /!(* 2 *)/}” – > prefix =”match =’1’后缀=’2 3 4 5 6 7 8 9 10′.子串’1’与模式* 2 *不匹配,因此它匹配模式!(* 2 *).>“${a /!(* 2 *)/,}”.这里没有惊喜,所以不需要详细说明.>“${a //!(* 2 *)/}”.这里没有惊喜,所以不需要详细说明.>“${a //!(* 2 *)/,}” – > prefix =”match =’1’后缀=’2 3 4 5 6 7 8 9 10′.然后${suffix //!(* 2 *)/,}扩展为“,2”,如下所示.后缀开头的空字符串与模式!(* 2 *)匹配,在结果中生成一个额外的逗号.由于触发了零长度匹配特殊情况(如上所述),强制消耗后缀的第一个字符,留下’3 4 5 6 7 8 9 10′,其中匹配!(* 2 *)模式整数并替换为我们在扩展的最终结果中看到的最后一个逗号.

本站总结

以上是本站教程为你收集整理的bash – 负参数在参数扩展中如何在extglob中工作全部内容,希望文章能够帮你解决bash – 负参数在参数扩展中如何在extglob中工作所遇到的程序开发问题。

如果觉得本站教程网站内容还不错,欢迎将本站教程推荐给好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。