bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: capturing sub-expressions?


From: Pierre Gaston
Subject: Re: capturing sub-expressions?
Date: Tue, 29 Jan 2008 09:32:30 +0200

On Jan 28, 2008 4:00 AM, Linda Walsh <bash@tlinx.org> wrote:
> I was wondering -- in the bash substitute commands ${..%%|##|//} etc,
> is there a way to "capture" a subexpression, so that I can
> use the subexpression in the replacement string so I can
> end up 'only' with the the subexpression?

I don't think so, you can only use =~ and BASE_REMATCH

> If the full expression was in a shellvar "Options", I thought about
> using something like:
>      ${Option//!(expr)}
> which I hoped would have "!(expr) match anything but my desired
> expression, and the double "/" would say allow it to match multiple
> times, but it appears the "!()" construct is limited to pathname
> expansion?  Presuming that is true (limited to pathname expansion),
> is there anyway to do it on Shell vars?

!( ) is indeed not very intuitive, it is not limited to pathname
expansion but it is not as interesting as it might seem.

!(expr) will match anything that is not expr, for instance !(foo) will
match f  and bar, but it also  match "fooa",
the only thing that is not match is  exactly "foo", which is useful if
you do: "echo !(foo)" to list all the files except
the one named "foo".

Now if you use parameter expansion :
var=fooa;echo ${var//!(foo)/b} # prints "b" because !(foo) matches "fooa"
var=foo; echo ${var/!(foo)/b} # prints "bo" because !(foo) matches "fo"
var=foo; echo ${var/!(foo)/b} # prints "bb" because !(foo) matches "fo" and "o"


(in the regexp world a corresponding surprising result is  " echo foo
| sed 's/m*/a/g' "
where m* means 0 or more and thus match the 0m between each char)

> I keep confusing the path-matching regular expressions with
> string-matching expressions and keep getting disappointed when I'm
> re-reminded of the limitation...:-(

> Maybe an "RFE"?...(*sigh*)
> Linda
>
>
>
>
>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]