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
