ksh模式匹配疑问:ab!(cd)*匹配abcdef12与手册描述不符
ksh扩展模式匹配
!(cd)的逻辑说明 你遇到的问题核心是误解了!(pattern-list)的匹配规则:它匹配的是任何与括号内模式完全不相等的字符串片段,而非“不包含该模式的片段”。
你的例子拆解
执行命令:
$ [[ "abcdef12" == ab!(cd)* ]] && echo matched matched
匹配逻辑如下:
- 字符串开头的
ab与模式的ab完全匹配; - 模式中的
!(cd)需要匹配一段不等于cd的内容——这里它可以匹配单个字符c(显然c≠cd); - 最后的
*匹配剩余的def12;
整个模式因此匹配成功。
如何实现“排除包含cd的内容”
如果你想要匹配ab开头且后续内容**不包含cd**的字符串,需要调整模式为ab!(*cd*),此时abcdef12会因为包含cd而无法匹配:
$ [[ "abcdef12" == ab!(*cd*) ]] && echo matched # 无输出
内容的提问来源于stack exchange,提问作者Gilles Pion
相关产品推荐
相关产品推荐

