On Fri, 15 Feb 2008 22:02:03 +0100 Cyrille Lefevre wrote:
> not sure the results are right, here.
> using sed translated expressions :
comparing with sed is a good tactic, especially ast sed which
uses the same ast regex api as ksh
the examples exposed a few problems in both ksh93s+ and ast sed(1)
substitution -- these have been fixed but won't be posted until
ksh93t- sometime near march 1
at the end of this post is a self-documenting test harness ksh93 script
before that is the --all output for the test script against the (as yet
unposted) fixed ksh93 and ast sed -- this shows the expected results
-- Glenn Fowler -- AT&T Research, Florham Park NJ --
---
${s/e/#} 's/e/#/' 'A regular expressions test'
ksh 'A r#gular expressions test'
${s//e/#} 's/e/#/g' 'A regular expressions test'
ksh 'A r#gular #xpr#ssions t#st'
${s/[^e]/#} 's/[^e]/#/' 'A regular expressions test'
ksh '# regular expressions test'
${s//[^e]/#} 's/[^e]/#/g' 'A regular expressions test'
ksh '###e######e###e########e##'
${s/+(e)/#} 's/e\{1,\}/#/' 'A regular expressions test'
ksh 'A r#gular expressions test'
${s//+(e)/#} 's/e\{1,\}/#/g' 'A regular expressions test'
ksh 'A r#gular #xpr#ssions t#st'
${s/@-(e)/#} 's/e\{1,\}/#/' 'A regular expressions test'
ksh 'A r#gular expressions test'
${s//@-(e)/#} 's/e\{1,\}/#/g' 'A regular expressions test'
ksh 'A r#gular #xpr#ssions t#st'
${s/?(e)/#} 's/e\{0,1\}/#/' 'A regular expressions test'
ksh '#A regular expressions test'
${s//?(e)/#} 's/e\{0,1\}/#/g' 'A regular expressions test'
ksh '#A# #r#g#u#l#a#r# #x#p#r#s#s#i#o#n#s# #t#s#t#'
${s/*(e)/#} 's/e*/#/' 'A regular expressions test'
ksh '#A regular expressions test'
${s//*(e)/#} 's/e*/#/g' 'A regular expressions test'
ksh '#A# #r#g#u#l#a#r# #x#p#r#s#s#i#o#n#s# #t#s#t#'
${s//@(e)/[\1]} 's/\(e\)/[\1]/g' 'A regular expressions test'
ksh 'A r[e]gular [e]xpr[e]ssions t[e]st'
${s//@-(e)/[\1]} 's/\(e\)/[\1]/g' 'A regular expressions test'
ksh 'A r[e]gular [e]xpr[e]ssions t[e]st'
${s//+(e)/[\1]} 's/\(e\)\{1,\}/[\1]/g' 'A regular expressions test'
ksh 'A r[e]gular [e]xpr[e]ssions t[e]st'
${s//+-(e)/[\1]} 's/\(e\)\{1,\}/[\1]/g' 'A regular expressions test'
ksh 'A r[e]gular [e]xpr[e]ssions t[e]st'
${s//@(+(e))/[\1]} 's/\(e\{1,\}\)/[\1]/g' 'A regular expressions test'
ksh 'A r[e]gular [e]xpr[e]ssions t[e]st'
${s//@(+-(e))/[\1]} 's/\(e\{1,\}\)/[\1]/g' 'A regular expressions test'
ksh 'A r[e]gular [e]xpr[e]ssions t[e]st'
${s//-(e)/#} 's/-(e)/#/g' 'A regular expressions test'
ksh 'A regular expressions test'
${s//--(e)/#} 's/--(e)/#/g' 'A regular expressions test'
ksh 'A regular expressions test'
${s//?(e)/[\1]} 's/\(e\)\{0,1\}/[\1]/g' 'A regular expressions test'
ksh '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
${s//{0,1}(e)/[\1]} 's/\(e\)\{0,1\}/[\1]/g' 'A regular expressions test'
ksh '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
${s//*(e)/[\1]} 's/\(e\)*/[\1]/g' 'A regular expressions test'
ksh '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
${s//{0,}(e)/[\1]} 's/\(e\)\{0,\}/[\1]/g' 'A regular expressions test'
ksh '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
${s//@(?(e))/[\1]} 's/\(e\{0,1\}\)/[\1]/g' 'A regular expressions test'
ksh '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
${s//@({0,1}(e))/[\1]} 's/\(e\{0,1\}\)/[\1]/g' 'A regular expressions test'
ksh '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
${s//@(*(e))/[\1]} 's/\(e*\)/[\1]/g' 'A regular expressions test'
ksh '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
${s//@({0,}(e))/[\1]} 's/\(e\{0,\}\)/[\1]/g' 'A regular expressions test'
ksh '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]'
${s/?-(e)/#} 's/e??/#/' 'A regular expressions test'
ksh '#A regular expressions test'
${s/@(?-(e))/[\1]} 's/(e??)/[\1]/' 'A regular expressions test'
ksh '[]A regular expressions test'
${s/!(e)/#} 's/e!/#/' 'A regular expressions test'
ksh '#'
${s//!(e)/#} 's/e!/#/g' 'A regular expressions test'
ksh '#'
${s/@(!(e))/[\1]} 's/(e!)/[\1]/' 'A regular expressions test'
ksh '[A regular expressions test]'
${s//@(!(e))/[\1]} 's/(e!)/[\1]/g' 'A regular expressions test'
ksh '[A regular expressions test]'
${s/!(e)/#} 's/e!/#/' 'e'
ksh '#e'
${s//!(e)/#} 's/e!/#/g' 'e'
ksh '#e#'
${s/!(e)/[\1]} 's/(e)!/[\1]/' 'e'
ksh '[]e'
${s//!(e)/[\1]} 's/(e)!/[\1]/g' 'e'
ksh '[]e[]'
${s/@(!(e))/[\1]} 's/(e!)/[\1]/' 'e'
ksh '[]e'
${s//@(!(e))/[\1]} 's/(e!)/[\1]/g' 'e'
ksh '[]e[]'
${s/@(!(a))/[\1]} 's/(a!)/[\1]/' 'a'
ksh '[]a'
${s//@(!(a))/[\1]} 's/(a!)/[\1]/g' 'a'
ksh '[]a[]'
${s/@(!(a))/[\1]} 's/(a!)/[\1]/' 'aha'
ksh '[aha]'
${s//@(!(a))/[\1]} 's/(a!)/[\1]/g' 'aha'
ksh '[aha]'
${s/@(!(aha))/[\1]} 's/((aha)!)/[\1]/' 'aha'
ksh '[ah]a'
${s//@(!(aha))/[\1]} 's/((aha)!)/[\1]/g' 'aha'
ksh '[ah][a]'
---
and here is the test script
---
COMMAND=testsub
USAGE_LICENSE="[-author?Glenn Fowler <[EMAIL PROTECTED]>]"
USAGE=$'
[-?
@(#)$Id: test-026 (AT&T Research) 2008-02-14 $
]
'$USAGE_LICENSE$'
[+NAME?test-026 - ksh93 substitution expansion tests]
[+DESCRIPTION?\btestsub\b runs ksh93 substitution expansion tests. The
optional \ased\a operand specifies the full path to \bsed\b(1). By
default the \bsed\b on \bPATH\b is used. Each test result is reported
on 2 or 3 lines. The first line is the ksh93 substitution expression,
the corresponding \bsed\b(1) expression, and the subject string. The
next lines is the \bksh\b result. If the \bsed\b result differs fro the
\bksh\b result then it is listed next.]
[a:all?List all tests results. By default only tests that differ from
\bsed\b(1) are listed.]
[ sed ]
[+SEE ALSO?\bksh\b(1), \bsed\b(1)]
'
function usage
{
OPTIND=0
getopts -a $COMMAND "$USAGE" OPT '-?'
exit 2
}
all=
sed=sed
while getopts $ARGV0 "$USAGE" OPT
do case $OPT in
a) all=1 ;;
*) usage ;;
esac
done
shift $OPTIND-1
case $# in
0) ;;
1) sed=$1 ;;
*) usage ;;
esac
set --noglob --nobraceexpand
set -- \
subject 'A regular expressions test' \
'/e/#' 's/e/#/' \
'//e/#' 's/e/#/g' \
'/[^e]/#' 's/[^e]/#/' \
'//[^e]/#' 's/[^e]/#/g' \
'/+(e)/#' 's/e\{1,\}/#/' \
'//+(e)/#' 's/e\{1,\}/#/g' \
'/@-(e)/#' 's/e\{1,\}/#/' \
'//@-(e)/#' 's/e\{1,\}/#/g' \
'/?(e)/#' 's/e\{0,1\}/#/' \
'//?(e)/#' 's/e\{0,1\}/#/g' \
'/*(e)/#' 's/e*/#/' \
'//*(e)/#' 's/e*/#/g' \
'//@(e)/[\1]' 's/\(e\)/[\1]/g' \
'//@-(e)/[\1]' 's/\(e\)/[\1]/g' \
'//+(e)/[\1]' 's/\(e\)\{1,\}/[\1]/g' \
'//+-(e)/[\1]' 's/\(e\)\{1,\}/[\1]/g' \
'//@(+(e))/[\1]' 's/\(e\{1,\}\)/[\1]/g' \
'//@(+-(e))/[\1]' 's/\(e\{1,\}\)/[\1]/g' \
'//-(e)/#' 's/-(e)/#/g' \
'//--(e)/#' 's/--(e)/#/g' \
'//?(e)/[\1]' 's/\(e\)\{0,1\}/[\1]/g' \
'//{0,1}(e)/[\1]' 's/\(e\)\{0,1\}/[\1]/g' \
'//*(e)/[\1]' 's/\(e\)*/[\1]/g' \
'//{0,}(e)/[\1]' 's/\(e\)\{0,\}/[\1]/g' \
'//@(?(e))/[\1]' 's/\(e\{0,1\}\)/[\1]/g' \
'//@({0,1}(e))/[\1]' 's/\(e\{0,1\}\)/[\1]/g' \
'//@(*(e))/[\1]' 's/\(e*\)/[\1]/g' \
'//@({0,}(e))/[\1]' 's/\(e\{0,\}\)/[\1]/g' \
option '-E' \
'/?-(e)/#' 's/e??/#/' \
'/@(?-(e))/[\1]' 's/(e??)/[\1]/' \
option '-A' \
'/!(e)/#' 's/e!/#/' \
'//!(e)/#' 's/e!/#/g' \
'/@(!(e))/[\1]' 's/(e!)/[\1]/' \
'//@(!(e))/[\1]' 's/(e!)/[\1]/g' \
subject 'e' \
'/!(e)/#' 's/e!/#/' \
'//!(e)/#' 's/e!/#/g' \
'/!(e)/[\1]' 's/(e)!/[\1]/' \
'//!(e)/[\1]' 's/(e)!/[\1]/g' \
'/@(!(e))/[\1]' 's/(e!)/[\1]/' \
'//@(!(e))/[\1]' 's/(e!)/[\1]/g' \
subject 'a' \
'/@(!(a))/[\1]' 's/(a!)/[\1]/' \
'//@(!(a))/[\1]' 's/(a!)/[\1]/g' \
subject 'aha' \
'/@(!(a))/[\1]' 's/(a!)/[\1]/' \
'//@(!(a))/[\1]' 's/(a!)/[\1]/g' \
'/@(!(aha))/[\1]' 's/((aha)!)/[\1]/' \
'//@(!(aha))/[\1]' 's/((aha)!)/[\1]/g' \
end
s=
o=
k=1
while (( $# >= 2 ))
do case $1 in
end) break
;;
option) o=$2
if ! $sed $o 1q < /dev/null > /dev/null 2>&1
then k=
print -u2 $COMMAND: $sed: $o: unkown option: skipping
$o tests
else k=1
fi
;;
subject)s=$2
;;
*) if [[ $k ]]
then a=$(print -r -- "$s" | $sed $o "$2")
eval b='${s'$1'}'
if [[ $all || "$a" != "$b" ]]
then printf $'%-20s %-20s \'%s\'\n ksh \'%s\'\n'
"\${s$1}" "'$2'" "$s" "$b"
if [[ "$a" != "$b" ]]
then printf $' sed \'%s\'\n' "$a"
fi
fi
fi
;;
esac
shift 2
done
_______________________________________________
ast-users mailing list
[email protected]
https://mailman.research.att.com/mailman/listinfo/ast-users