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

Reply via email to