On Mon, Dec 3, 2012 at 6:16 PM, j. v. d. hoff <[email protected]>wrote:

> On Mon, 03 Dec 2012 03:04:45 +0100, Clark WANG <[email protected]> wrote:
>
>  On Mon, Dec 3, 2012 at 3:37 AM, j. v. d. hoff <[email protected]>
>> **wrote:
>>
>>  hi,
>>>
>>> I'm currently trying to set up a `ksh' script as a drop in replacement
>>> for
>>> `awk' in processing some text. I've stumbled over the following.
>>> consider this  string:
>>>
>>> a="water: h~2~^o^ and ammonia: NH~3~"
>>>
>>> where I want to replace the `~' enclosed text parts by something else,
>>> maintaining the enclosed text. I've tried
>>>
>>> echo "${a/~(-g:~(*)~)/#\1#}"
>>>
>>> to replace the first hit in the line by `h#2#'
>>>
>>> but this does not work (neither does the same with backquoted `~').
>>>
>>> what am I missing? something to do with tilde expansion?
>>>
>>>
>> [STEP 100] $ echo ${.sh.version}
>> Version AJMP 93u+ 2012-08-01
>> [STEP 101] $ a="water: h~2~^o^ and ammonia: NH~3~"
>> [STEP 102] $ echo "${a/@-(~@(*)~)/#\2#}"
>> water: h#2#^o^ and ammonia: NH~3~
>> [STEP 103] $ echo "${a//@-(~@(*)~)/#\2#}"
>> water: h#2#^o^ and ammonia: NH#3#
>> [STEP 104] $
>>
>
> thanks a lot, that's exactly what I need. I'll use that one. I'm more at
> home with standard regex, so I don't quite understand what the pattern is
> doing: especially
> the leading `-' in front of the "core pattern". what does
> `-(pattern-list)' mean? I see it makes the pattern non-greedy, but I don't
> find it in the manpage (or the book).
>

It's in the man page:

       ... ...
       of the string will be chosen.   However, for each of the above
compound
       patterns a - can be inserted in front of the ( to  cause  the
shortest
       match to the specified pattern-list to be used.

>
> but regarding my own, failed, attempt at a solution: why is
>
> echo "${a//~(-g:~(*)~)/#\1#}"
>

This would work if you save the pattern in a var which is the recommended
way especially for such complicated patterns.

$ echo ${.sh.version}
Version AJMP 93u+ 2012-08-01
$ a="water: h~2~^o^ and ammonia: NH~3~"
$ pat='~(-g:\~(*)~)'  ## Without the \ char, ~ would be considered to be
part of the pattern.
$ echo "${a//$pat/#\1#}"
water: h#2#^o^ and ammonia: NH#3#
$

>
> _not_ doing the intended? if I read the manpage correctly, it should. and
>
> echo "${a//~(-g:^(*)^)/#\1#}"
>
> indeed _does_ replace the `^' characters enclosing the `o' in the example
> string $a. only after your answer I've tried
>
> echo "${a//~(-g:~@(*)~)/#\1#}"
>
> why do I need the "exactly one" `@' qualifier for `(*)' here (and in your
> solution) when the enclosing characters are `~' (but not, e.g., `^')?
>
> I suspect it has something to do with the `~' being special but I don't
> see why and how.
>
> j.
>
>
>
>
>
>>
>>> thanks
>>> joerg
>>> --
>>> Using Opera's revolutionary email client: http://www.opera.com/mail/
>>> ______________________________****_________________
>>> ast-users mailing list
>>> [email protected].****com 
>>> <[email protected].**com<[email protected]>
>>> >
>>> http://lists.research.att.com/****mailman/listinfo/ast-users<http://lists.research.att.com/**mailman/listinfo/ast-users>
>>> <h**ttp://lists.research.att.com/**mailman/listinfo/ast-users<http://lists.research.att.com/mailman/listinfo/ast-users>
>>> >
>>>
>>>
>
> --
> Using Opera's revolutionary email client: http://www.opera.com/mail/
>
_______________________________________________
ast-users mailing list
[email protected]
http://lists.research.att.com/mailman/listinfo/ast-users

Reply via email to