我以为我理解了可选?(pattern-list)在bash中(当extglob shell选项是on)和默认情况下在ksh中的使用。例如,在bash中
$ shopt -s extglob
$ V=35xAB
$ echo "${V#?(35|88)x}" "${V#35}"
AB xAB但是,当匹配前缀模式只是一个?()或一个*() (这引入了我所说的可选模式)时,除非使用,否则不会省略35:
$ echo "${V#?(35|88)}" "${V#*(35|88)}" # Why 35 is not left out?
35xA 35xA
$ echo "${V##?(35|88)}" "${V##*(35|88)}" # Why is it omitted when ## is used?
xA xA当?()和*()在匹配后缀模式(使用%和%%)中使用时,也会报告相同的行为:
$ echo "${V%5?(xA|Bz)}" # 5xA is omitted
3
$ echo "${V%?(xA|Bz)}" "${V%*(xA|Bz)}" # why xA is not left out?
35xA 35xA
$ echo "${V%%?(xA|Bz)}" "${V%%*(xA|Bz)}" # xA is omitted when %% is used
35 35我在bash版本3.2.25、4.1.2和4.1.6中测试了这个问题,这让我认为,也许我还没有正确理解匹配模式的实际底层shell机制。
有人能解释一下这件事吗?
提前感谢
发布于 2016-09-12 08:09:06
如果您使用的是@而不是?,那么它就会像预期的那样工作:
$> echo "${V#@(35|88)}"
xAB
$> echo "${V%@(xAB|Bzh)}"
35类似于+而不是*的行为
$> echo "${V#*(35|88)}"
35xAB
$>echo "${V#+(35|88)}"
xAB这是因为:
?(pattern-list) #匹配零或给定模式的一次出现@(pattern-list) #匹配给定模式的一个和:
*(pattern-list) #匹配零或更多给定模式的出现+(pattern-list) #匹配一个或多个给定模式的出现https://stackoverflow.com/questions/39445699
复制相似问题