bash – 负参数在参数扩展中如何在extglob中工作
问题
的行为 !(pattern-list) 特别是在参数扩展中使用时,我的工作方式不正常 ${parameter/pattern/string} 输入 a="1 2 3 4 5 6 7 8 9 10" 测试用例 $printf "%sn" "${a/!([0-9])/}" [blank] #expected 12 3 4 5 6 7 8 9 10 $printf "%sn" "${a/!(2)/}" [blank] #expected 2 3 4 5 6 7 8 9 10 $printf "%sn" "${a/!(*2*)/}" 2 3 4 5 6 7 8 9 10 #Produces the behaviour expected in previous one,not sure why though $printf "%sn" "${a/!(*2*)/,}",2 3 4 5 6 7 8 9 10 #Expected after previous worked $printf "%sn" "${a//!(*2*)/}" 2 #Expected again previous worked $printf "%sn" "${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}” ${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 *)模式整数并替换为我们在扩展的最终结果中看到的最后一个逗号. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- twitter-bootstrap – Twitter Bootstrap仅在移动设备上崩溃
- bootstrap模态框实现拖拽效果
- VIM编辑器可以进行任何默认设置吗?
- scala – 如何在连接中使用Column.isin和数组列?
- Bootstrap3 代码-代码块
- 为什么ssh远程命令的$PATH与交互式shell的$PATH不同?
- angular – 未处理的Promise拒绝:没有TranslateService的提
- Linux Namespace : User
- angularjs – 未知的提供者:groupByFilterProvider < - gr
- angular – 如何从MatSnackBarConfig获取数据属性