Bernd Eggink <[EMAIL PROTECTED]> wrote: > My impression is that the pattern lookup depends on whether or not a > !' is involved. If the pattern does not contain a '!', the shell looks > for matching substrings, from left to right. If it contains a '!', the > value as a whole is matched.
It looks for substrings in both cases - specifically, the longest matching substring, which might happen to be the entire string. With !(), that is often the case. > x=12ab34; echo ${x//+([0-9])/X} # prints XabX > x=12ab34; echo ${x//!(+([0-9]))/X} # prints X > > If the same algorithm had been applied in the 2nd case, the first > substring matching the pattern "not a sequence of at least one digit" > would have been 'a' (or maybe 'ab'), and the output would have been > 12Xb34' (or '12X34'). "12ab34" is also "not a sequence of at least one digit", so as the longest match, it is preferred. Note how "not a sequence of at least one digit" differs from "a sequence of at least one nondigit"; the latter is specified as +([!0-9]) and has the behavior you expect !(+([0-9])) to have. > IMHO (please correct me if I'm wrong) this contradicts the usual > meaning of the '!' operator Negation is negation, but it has different effects on the overall result depending on where you place it in the pattern. paul