1da2e3ebdSchin######################################################################## 2da2e3ebdSchin# # 3da2e3ebdSchin# This software is part of the ast package # 4*3e14f97fSRoger A. Faulkner# Copyright (c) 1982-2010 AT&T Intellectual Property # 5da2e3ebdSchin# and is licensed under the # 6da2e3ebdSchin# Common Public License, Version 1.0 # 77c2fbfb3SApril Chin# by AT&T Intellectual Property # 8da2e3ebdSchin# # 9da2e3ebdSchin# A copy of the License is available at # 10da2e3ebdSchin# http://www.opensource.org/licenses/cpl1.0.txt # 11da2e3ebdSchin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) # 12da2e3ebdSchin# # 13da2e3ebdSchin# Information and Software Systems Research # 14da2e3ebdSchin# AT&T Research # 15da2e3ebdSchin# Florham Park NJ # 16da2e3ebdSchin# # 17da2e3ebdSchin# David Korn <dgk@research.att.com> # 18da2e3ebdSchin# # 19da2e3ebdSchin######################################################################## 20da2e3ebdSchinfunction err_exit 21da2e3ebdSchin{ 227c2fbfb3SApril Chin print -u2 -r $'\t'"${Command}[$1] ${@:2}" 23da2e3ebdSchin ((errors++)) 24da2e3ebdSchin} 25da2e3ebdSchinalias err_exit='err_exit $LINENO' 26da2e3ebdSchin 2734f9b3eeSRoland MainzCommand=${0##*/} 2834f9b3eeSRoland Mainzinteger aware=0 contrary=0 errors=0 ignorant=0 2934f9b3eeSRoland Mainz 3034f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; } 3134f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT 32da2e3ebdSchin 33da2e3ebdSchinfunction test_glob 34da2e3ebdSchin{ 35da2e3ebdSchin typeset lineno expected drop arg got sep op val add del 367c2fbfb3SApril Chin lineno=$1 377c2fbfb3SApril Chin shift 38da2e3ebdSchin if [[ $1 == --* ]] 39da2e3ebdSchin then del=${1#--} 40da2e3ebdSchin shift 41da2e3ebdSchin fi 42da2e3ebdSchin if [[ $1 == ++* ]] 43da2e3ebdSchin then add=${1#++} 44da2e3ebdSchin shift 45da2e3ebdSchin fi 467c2fbfb3SApril Chin expected=$1 477c2fbfb3SApril Chin shift 48da2e3ebdSchin if (( contrary )) 49da2e3ebdSchin then if [[ $expected == "<Beware> "* ]] 50da2e3ebdSchin then expected=${expected#"<Beware> "} 51da2e3ebdSchin expected="$expected <Beware>" 52da2e3ebdSchin fi 53da2e3ebdSchin if [[ $expected == *"<aXb> <abd>"* ]] 54da2e3ebdSchin then expected=${expected/"<aXb> <abd>"/"<abd> <aXb>"} 55da2e3ebdSchin fi 56da2e3ebdSchin fi 57da2e3ebdSchin for arg 58da2e3ebdSchin do got="$got$sep<$arg>" 59da2e3ebdSchin sep=" " 60da2e3ebdSchin done 61da2e3ebdSchin if (( ignorant && aware )) 62da2e3ebdSchin then if [[ $del ]] 63da2e3ebdSchin then got="<$del> $got" 64da2e3ebdSchin fi 65da2e3ebdSchin if [[ $add ]] 66da2e3ebdSchin then expected="<$add> $expected" 67da2e3ebdSchin fi 68da2e3ebdSchin fi 69da2e3ebdSchin if [[ $got != "$expected" ]] 707c2fbfb3SApril Chin then 'err_exit' $lineno "glob -- expected '$expected', got '$got'" 71da2e3ebdSchin fi 72da2e3ebdSchin} 737c2fbfb3SApril Chinalias test_glob='test_glob $LINENO' 74da2e3ebdSchin 75da2e3ebdSchinfunction test_case 76da2e3ebdSchin{ 77da2e3ebdSchin typeset lineno expected subject pattern got 78da2e3ebdSchin lineno=$1 expected=$2 subject=$3 pattern=$4 79da2e3ebdSchin eval " 80da2e3ebdSchin case $subject in 81da2e3ebdSchin $pattern) got='<match>' ;; 82da2e3ebdSchin *) got='<nomatch>' ;; 83da2e3ebdSchin esac 84da2e3ebdSchin " 85da2e3ebdSchin if [[ $got != "$expected" ]] 867c2fbfb3SApril Chin then 'err_exit' $lineno "case $subject in $pattern) -- expected '$expected', got '$got'" 87da2e3ebdSchin fi 88da2e3ebdSchin} 897c2fbfb3SApril Chinalias test_case='test_case $LINENO' 90da2e3ebdSchin 91da2e3ebdSchinunset undefined 92da2e3ebdSchin 93da2e3ebdSchinexport LC_COLLATE=C 94da2e3ebdSchin 9534f9b3eeSRoland Mainzcd $tmp || { err_exit "cd $tmp failed"; exit 1; } 96da2e3ebdSchin 97da2e3ebdSchintouch B b 98da2e3ebdSchinset -- * 99da2e3ebdSchincase $* in 100da2e3ebdSchin'b B') contrary=1 ;; 101da2e3ebdSchinb|B) ignorant=1 ;; 102da2e3ebdSchinesac 103da2e3ebdSchinset -- $(/bin/sh -c 'echo [a-c]') 104da2e3ebdSchincase $* in 105da2e3ebdSchinB) aware=1 ;; 106da2e3ebdSchinesac 107da2e3ebdSchinrm -rf * 108da2e3ebdSchin 109da2e3ebdSchintouch a b c d abc abd abe bb bcd ca cb dd de Beware 110da2e3ebdSchinmkdir bdir 111da2e3ebdSchin 1127c2fbfb3SApril Chintest_glob '<a> <abc> <abd> <abe> <X*>' a* X* 1137c2fbfb3SApril Chintest_glob '<a> <abc> <abd> <abe>' \a* 114da2e3ebdSchin 115da2e3ebdSchinif ( set --nullglob ) 2>/dev/null 116da2e3ebdSchinthen 117da2e3ebdSchin set --nullglob 118da2e3ebdSchin 1197c2fbfb3SApril Chin test_glob '<a> <abc> <abd> <abe>' a* X* 120da2e3ebdSchin 121da2e3ebdSchin set --nonullglob 122da2e3ebdSchinfi 123da2e3ebdSchin 124da2e3ebdSchinif ( set --failglob ) 2>/dev/null 125da2e3ebdSchinthen 126da2e3ebdSchin set --failglob 127da2e3ebdSchin mkdir tmp 128da2e3ebdSchin touch tmp/l1 tmp/l2 tmp/l3 129da2e3ebdSchin 1307c2fbfb3SApril Chin test_glob '' tmp/l[12] tmp/*4 tmp/*3 1317c2fbfb3SApril Chin test_glob '' tmp/l[12] tmp/*4 tmp/*3 132da2e3ebdSchin 133da2e3ebdSchin rm -r tmp 134da2e3ebdSchin set --nofailglob 135da2e3ebdSchinfi 136da2e3ebdSchin 1377c2fbfb3SApril Chintest_glob '<bdir/>' b*/ 1387c2fbfb3SApril Chintest_glob '<*>' \* 1397c2fbfb3SApril Chintest_glob '<a*>' 'a*' 1407c2fbfb3SApril Chintest_glob '<a*>' a\* 1417c2fbfb3SApril Chintest_glob '<c> <ca> <cb> <a*> <*q*>' c* a\* *q* 1427c2fbfb3SApril Chintest_glob '<**>' "*"* 1437c2fbfb3SApril Chintest_glob '<**>' \** 1447c2fbfb3SApril Chintest_glob '<\.\./*/>' "\.\./*/" 1457c2fbfb3SApril Chintest_glob '<s/\..*//>' 's/\..*//' 1467c2fbfb3SApril Chintest_glob '</^root:/{s/^[!:]*:[!:]*:\([!:]*\).*$/\1/>' "/^root:/{s/^[!:]*:[!:]*:\([!:]*\).*"'$'"/\1/" 1477c2fbfb3SApril Chintest_glob '<abc> <abd> <abe> <bb> <cb>' [a-c]b* 1487c2fbfb3SApril Chintest_glob ++Beware '<abd> <abe> <bb> <bcd> <bdir> <ca> <cb> <dd> <de>' [a-y]*[!c] 1497c2fbfb3SApril Chintest_glob '<abd> <abe>' a*[!c] 150da2e3ebdSchin 151da2e3ebdSchintouch a-b aXb 152da2e3ebdSchin 1537c2fbfb3SApril Chintest_glob '<a-b> <aXb>' a[X-]b 154da2e3ebdSchin 155da2e3ebdSchintouch .x .y 156da2e3ebdSchin 1577c2fbfb3SApril Chintest_glob --Beware '<Beware> <d> <dd> <de>' [!a-c]* 158da2e3ebdSchin 159da2e3ebdSchinif mkdir a\*b 2>/dev/null 160da2e3ebdSchinthen 161da2e3ebdSchin touch a\*b/ooo 162da2e3ebdSchin 1637c2fbfb3SApril Chin test_glob '<a*b/ooo>' a\*b/* 1647c2fbfb3SApril Chin test_glob '<a*b/ooo>' a\*?/* 1657c2fbfb3SApril Chin test_case '<match>' '!7' '*\!*' 1667c2fbfb3SApril Chin test_case '<match>' 'r.*' '*.\*' 1677c2fbfb3SApril Chin test_glob '<abc>' a[b]c 1687c2fbfb3SApril Chin test_glob '<abc>' a["b"]c 1697c2fbfb3SApril Chin test_glob '<abc>' a[\b]c 1707c2fbfb3SApril Chin test_glob '<abc>' a?c 1717c2fbfb3SApril Chin test_case '<match>' 'abc' 'a"b"c' 1727c2fbfb3SApril Chin test_case '<match>' 'abc' 'a*c' 1737c2fbfb3SApril Chin test_case '<nomatch>' 'abc' '"a?c"' 1747c2fbfb3SApril Chin test_case '<nomatch>' 'abc' 'a\*c' 1757c2fbfb3SApril Chin test_case '<nomatch>' 'abc' 'a\[b]c' 1767c2fbfb3SApril Chin test_case '<match>' '"$undefined"' '""' 1777c2fbfb3SApril Chin test_case '<match>' 'abc' 'a["\b"]c' 178da2e3ebdSchin 179da2e3ebdSchin rm -rf mkdir a\*b 180da2e3ebdSchinfi 181da2e3ebdSchin 182da2e3ebdSchinmkdir man 183da2e3ebdSchinmkdir man/man1 184da2e3ebdSchintouch man/man1/sh.1 185da2e3ebdSchin 1867c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' */man*/sh.* 1877c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' $(echo */man*/sh.*) 1887c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' "$(echo */man*/sh.*)" 189da2e3ebdSchin 1907c2fbfb3SApril Chintest_case '<match>' 'abc' 'a***c' 1917c2fbfb3SApril Chintest_case '<match>' 'abc' 'a*****?c' 1927c2fbfb3SApril Chintest_case '<match>' 'abc' '?*****??' 1937c2fbfb3SApril Chintest_case '<match>' 'abc' '*****??' 1947c2fbfb3SApril Chintest_case '<match>' 'abc' '*****??c' 1957c2fbfb3SApril Chintest_case '<match>' 'abc' '?*****?c' 1967c2fbfb3SApril Chintest_case '<match>' 'abc' '?***?****c' 1977c2fbfb3SApril Chintest_case '<match>' 'abc' '?***?****?' 1987c2fbfb3SApril Chintest_case '<match>' 'abc' '?***?****' 1997c2fbfb3SApril Chintest_case '<match>' 'abc' '*******c' 2007c2fbfb3SApril Chintest_case '<match>' 'abc' '*******?' 2017c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a*cd**?**??k' 2027c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a**?**cd**?**??k' 2037c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a**?**cd**?**??k***' 2047c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a**?**cd**?**??***k' 2057c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a**?**cd**?**??***k**' 2067c2fbfb3SApril Chintest_case '<match>' 'abcdecdhjk' 'a****c**?**??*****' 2077c2fbfb3SApril Chintest_case '<match>' "'-'" '[-abc]' 2087c2fbfb3SApril Chintest_case '<match>' "'-'" '[abc-]' 2097c2fbfb3SApril Chintest_case '<match>' "'\\'" '\\' 2107c2fbfb3SApril Chintest_case '<match>' "'\\'" '[\\]' 2117c2fbfb3SApril Chintest_case '<match>' "'\\'" "'\\'" 2127c2fbfb3SApril Chintest_case '<match>' "'['" '[[]' 2137c2fbfb3SApril Chintest_case '<match>' '[' '[[]' 2147c2fbfb3SApril Chintest_case '<match>' "'['" '[' 2157c2fbfb3SApril Chintest_case '<match>' '[' '[' 2167c2fbfb3SApril Chintest_case '<match>' "'[abc'" "'['*" 2177c2fbfb3SApril Chintest_case '<nomatch>' "'[abc'" '[*' 2187c2fbfb3SApril Chintest_case '<match>' '[abc' "'['*" 2197c2fbfb3SApril Chintest_case '<nomatch>' '[abc' '[*' 2207c2fbfb3SApril Chintest_case '<match>' 'abd' "a[b/c]d" 2217c2fbfb3SApril Chintest_case '<match>' 'a/d' "a[b/c]d" 2227c2fbfb3SApril Chintest_case '<match>' 'acd' "a[b/c]d" 2237c2fbfb3SApril Chintest_case '<match>' "']'" '[]]' 2247c2fbfb3SApril Chintest_case '<match>' "'-'" '[]-]' 2257c2fbfb3SApril Chintest_case '<match>' 'p' '[a-\z]' 2267c2fbfb3SApril Chintest_case '<match>' '"/tmp"' '[/\\]*' 2277c2fbfb3SApril Chintest_case '<nomatch>' 'abc' '??**********?****?' 2287c2fbfb3SApril Chintest_case '<nomatch>' 'abc' '??**********?****c' 2297c2fbfb3SApril Chintest_case '<nomatch>' 'abc' '?************c****?****' 2307c2fbfb3SApril Chintest_case '<nomatch>' 'abc' '*c*?**' 2317c2fbfb3SApril Chintest_case '<nomatch>' 'abc' 'a*****c*?**' 2327c2fbfb3SApril Chintest_case '<nomatch>' 'abc' 'a********???*******' 2337c2fbfb3SApril Chintest_case '<nomatch>' "'a'" '[]' 2347c2fbfb3SApril Chintest_case '<nomatch>' 'a' '[]' 2357c2fbfb3SApril Chintest_case '<nomatch>' "'['" '[abc' 2367c2fbfb3SApril Chintest_case '<nomatch>' '[' '[abc' 237da2e3ebdSchin 2387c2fbfb3SApril Chintest_glob ++Beware '<b> <bb> <bcd> <bdir>' b* 2397c2fbfb3SApril Chintest_glob '<Beware> <b> <bb> <bcd> <bdir>' [bB]* 240da2e3ebdSchin 241da2e3ebdSchinif ( set --nocaseglob ) 2>/dev/null 242da2e3ebdSchinthen 243da2e3ebdSchin set --nocaseglob 244da2e3ebdSchin 2457c2fbfb3SApril Chin test_glob '<Beware> <b> <bb> <bcd> <bdir>' b* 2467c2fbfb3SApril Chin test_glob '<Beware> <b> <bb> <bcd> <bdir>' [b]* 2477c2fbfb3SApril Chin test_glob '<Beware> <b> <bb> <bcd> <bdir>' [bB]* 248da2e3ebdSchin 249da2e3ebdSchin set --nonocaseglob 250da2e3ebdSchinfi 251da2e3ebdSchin 252da2e3ebdSchinif ( set -f ) 2>/dev/null 253da2e3ebdSchinthen 254da2e3ebdSchin set -f 255da2e3ebdSchin 2567c2fbfb3SApril Chin test_glob '<*>' * 257da2e3ebdSchin 258da2e3ebdSchin set +f 259da2e3ebdSchinfi 260da2e3ebdSchin 261da2e3ebdSchinif ( set --noglob ) 2>/dev/null 262da2e3ebdSchinthen 263da2e3ebdSchin set --noglob 264da2e3ebdSchin 2657c2fbfb3SApril Chin test_glob '<*>' * 266da2e3ebdSchin 267da2e3ebdSchin set --glob 268da2e3ebdSchinfi 269da2e3ebdSchin 270da2e3ebdSchinFIGNORE='.*|*' 2717c2fbfb3SApril Chintest_glob '<*>' * 272da2e3ebdSchin 273da2e3ebdSchinFIGNORE='.*|*c|*e|?' 2747c2fbfb3SApril Chintest_glob '<a-b> <aXb> <abd> <bb> <bcd> <bdir> <ca> <cb> <dd> <man>' * 275da2e3ebdSchin 276da2e3ebdSchinFIGNORE='.*|*b|*d|?' 2777c2fbfb3SApril Chintest_glob '<Beware> <abc> <abe> <bdir> <ca> <de> <man>' * 278da2e3ebdSchin 279da2e3ebdSchinFIGNORE= 2807c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' */man*/sh.* 281da2e3ebdSchin 282da2e3ebdSchinunset FIGNORE 2837c2fbfb3SApril Chintest_glob '<bb> <ca> <cb> <dd> <de>' ?? 2847c2fbfb3SApril Chintest_glob '<man/man1/sh.1>' */man*/sh.* 285da2e3ebdSchin 286da2e3ebdSchinGLOBIGNORE='.*:*' 287da2e3ebdSchinset -- * 288da2e3ebdSchinif [[ $1 == '*' ]] 289da2e3ebdSchinthen 290da2e3ebdSchin GLOBIGNORE='.*:*c:*e:?' 2917c2fbfb3SApril Chin test_glob '<>' * 292da2e3ebdSchin 293da2e3ebdSchin GLOBIGNORE='.*:*b:*d:?' 2947c2fbfb3SApril Chin test_glob '<>' * 295da2e3ebdSchin 296da2e3ebdSchin unset GLOBIGNORE 2977c2fbfb3SApril Chin test_glob '<>' * 2987c2fbfb3SApril Chin test_glob '<man/man1/sh.1>' */man*/sh.* 299da2e3ebdSchin 300da2e3ebdSchin GLOBIGNORE= 3017c2fbfb3SApril Chin test_glob '<man/man1/sh.1>' */man*/sh.* 302da2e3ebdSchinfi 3037c2fbfb3SApril Chinunset GLOBIGNORE 3047c2fbfb3SApril Chin 3057c2fbfb3SApril Chinfunction test_sub 3067c2fbfb3SApril Chin{ 3077c2fbfb3SApril Chin x='${subject'$2'}' 3087c2fbfb3SApril Chin eval g=$x 3097c2fbfb3SApril Chin if [[ "$g" != "$3" ]] 3107c2fbfb3SApril Chin then 'err_exit' $1 subject="'$subject' $x failed, expected '$3', got '$g'" 3117c2fbfb3SApril Chin fi 3127c2fbfb3SApril Chin} 3137c2fbfb3SApril Chinalias test_sub='test_sub $LINENO' 3147c2fbfb3SApril Chin 3157c2fbfb3SApril Chinset --noglob --nobraceexpand 3167c2fbfb3SApril Chin 3177c2fbfb3SApril Chinsubject='A regular expressions test' 3187c2fbfb3SApril Chin 3197c2fbfb3SApril Chintest_sub '/e/#' 'A r#gular expressions test' 3207c2fbfb3SApril Chintest_sub '//e/#' 'A r#gular #xpr#ssions t#st' 3217c2fbfb3SApril Chintest_sub '/[^e]/#' '# regular expressions test' 3227c2fbfb3SApril Chintest_sub '//[^e]/#' '###e######e###e########e##' 3237c2fbfb3SApril Chintest_sub '/+(e)/#' 'A r#gular expressions test' 3247c2fbfb3SApril Chintest_sub '//+(e)/#' 'A r#gular #xpr#ssions t#st' 3257c2fbfb3SApril Chintest_sub '/@-(e)/#' 'A r#gular expressions test' 3267c2fbfb3SApril Chintest_sub '//@-(e)/#' 'A r#gular #xpr#ssions t#st' 3277c2fbfb3SApril Chintest_sub '/?(e)/#' '#A regular expressions test' 3287c2fbfb3SApril Chintest_sub '//?(e)/#' '#A# #r#g#u#l#a#r# #x#p#r#s#s#i#o#n#s# #t#s#t#' 3297c2fbfb3SApril Chintest_sub '/*(e)/#' '#A regular expressions test' 3307c2fbfb3SApril Chintest_sub '//*(e)/#' '#A# #r#g#u#l#a#r# #x#p#r#s#s#i#o#n#s# #t#s#t#' 3317c2fbfb3SApril Chintest_sub '//@(e)/[\1]' 'A r[e]gular [e]xpr[e]ssions t[e]st' 3327c2fbfb3SApril Chintest_sub '//@-(e)/[\1]' 'A r[e]gular [e]xpr[e]ssions t[e]st' 3337c2fbfb3SApril Chintest_sub '//+(e)/[\1]' 'A r[e]gular [e]xpr[e]ssions t[e]st' 3347c2fbfb3SApril Chintest_sub '//+-(e)/[\1]' 'A r[e]gular [e]xpr[e]ssions t[e]st' 3357c2fbfb3SApril Chintest_sub '//@(+(e))/[\1]' 'A r[e]gular [e]xpr[e]ssions t[e]st' 3367c2fbfb3SApril Chintest_sub '//@(+-(e))/[\1]' 'A r[e]gular [e]xpr[e]ssions t[e]st' 3377c2fbfb3SApril Chintest_sub '//-(e)/#' 'A regular expressions test' 3387c2fbfb3SApril Chintest_sub '//--(e)/#' 'A regular expressions test' 3397c2fbfb3SApril Chintest_sub '//?(e)/[\1]' '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]' 3407c2fbfb3SApril Chintest_sub '//{0,1}(e)/[\1]' '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]' 3417c2fbfb3SApril Chintest_sub '//*(e)/[\1]' '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]' 3427c2fbfb3SApril Chintest_sub '//{0,}(e)/[\1]' '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]' 3437c2fbfb3SApril Chintest_sub '//@(?(e))/[\1]' '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]' 3447c2fbfb3SApril Chintest_sub '//@({0,1}(e))/[\1]' '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]' 3457c2fbfb3SApril Chintest_sub '//@(*(e))/[\1]' '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]' 3467c2fbfb3SApril Chintest_sub '//@({0,}(e))/[\1]' '[]A[] []r[e]g[]u[]l[]a[]r[] [e]x[]p[]r[e]s[]s[]i[]o[]n[]s[] []t[e]s[]t[]' 3477c2fbfb3SApril Chintest_sub '/?-(e)/#' '#A regular expressions test' 3487c2fbfb3SApril Chintest_sub '/@(?-(e))/[\1]' '[]A regular expressions test' 3497c2fbfb3SApril Chintest_sub '/!(e)/#' '#' 3507c2fbfb3SApril Chintest_sub '//!(e)/#' '#' 3517c2fbfb3SApril Chintest_sub '/@(!(e))/[\1]' '[A regular expressions test]' 3527c2fbfb3SApril Chintest_sub '//@(!(e))/[\1]' '[A regular expressions test]' 3537c2fbfb3SApril Chin 3547c2fbfb3SApril Chinsubject='e' 3557c2fbfb3SApril Chin 3567c2fbfb3SApril Chintest_sub '/!(e)/#' '#e' 3577c2fbfb3SApril Chintest_sub '//!(e)/#' '#e#' 3587c2fbfb3SApril Chintest_sub '/!(e)/[\1]' '[]e' 3597c2fbfb3SApril Chintest_sub '//!(e)/[\1]' '[]e[]' 3607c2fbfb3SApril Chintest_sub '/@(!(e))/[\1]' '[]e' 3617c2fbfb3SApril Chintest_sub '//@(!(e))/[\1]' '[]e[]' 3627c2fbfb3SApril Chin 3637c2fbfb3SApril Chinsubject='a' 3647c2fbfb3SApril Chin 3657c2fbfb3SApril Chintest_sub '/@(!(a))/[\1]' '[]a' 3667c2fbfb3SApril Chintest_sub '//@(!(a))/[\1]' '[]a[]' 3677c2fbfb3SApril Chin 3687c2fbfb3SApril Chinsubject='aha' 3697c2fbfb3SApril Chin 3707c2fbfb3SApril Chintest_sub '/@(!(a))/[\1]' '[aha]' 3717c2fbfb3SApril Chintest_sub '//@(!(a))/[\1]' '[aha]' 3727c2fbfb3SApril Chintest_sub '/@(!(aha))/[\1]' '[ah]a' 3737c2fbfb3SApril Chintest_sub '//@(!(aha))/[\1]' '[ah][a]' 374da2e3ebdSchin 375da2e3ebdSchinexit $errors 376