[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: capturing sub-expressions?
From: |
Paul Jarc |
Subject: |
Re: capturing sub-expressions? |
Date: |
Tue, 29 Jan 2008 16:29:56 -0500 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.1 (gnu/linux) |
Bernd Eggink <monoped@sudrala.de> 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
Re: capturing sub-expressions?, Pierre Gaston, 2008/01/29