multi_test.sh revision 263227
155682Smarkm#!/bin/sh -
255682Smarkm#
355682Smarkm# Copyright (c) 1992 Diomidis Spinellis.
455682Smarkm# Copyright (c) 1992, 1993
555682Smarkm#	The Regents of the University of California.  All rights reserved.
655682Smarkm#
755682Smarkm# Redistribution and use in source and binary forms, with or without
855682Smarkm# modification, are permitted provided that the following conditions
955682Smarkm# are met:
1055682Smarkm# 1. Redistributions of source code must retain the above copyright
1155682Smarkm#    notice, this list of conditions and the following disclaimer.
1255682Smarkm# 2. Redistributions in binary form must reproduce the above copyright
1355682Smarkm#    notice, this list of conditions and the following disclaimer in the
1455682Smarkm#    documentation and/or other materials provided with the distribution.
1555682Smarkm# 4. Neither the name of the University nor the names of its contributors
1655682Smarkm#    may be used to endorse or promote products derived from this software
1755682Smarkm#    without specific prior written permission.
1855682Smarkm#
1955682Smarkm# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2055682Smarkm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2155682Smarkm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2255682Smarkm# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2355682Smarkm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2455682Smarkm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2555682Smarkm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2655682Smarkm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2755682Smarkm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2855682Smarkm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2955682Smarkm# SUCH DAMAGE.
3055682Smarkm#
3155682Smarkm#	@(#)sed.test	8.1 (Berkeley) 6/6/93
3255682Smarkm#
3355682Smarkm#	$FreeBSD: head/usr.bin/sed/tests/multi_test.sh 263227 2014-03-16 08:04:06Z jmmv $
3455682Smarkm#
3555682Smarkm
3655682Smarkm# sed Regression Tests
3755682Smarkm#
3855682Smarkm# The directory regress.test.out contains the expected test results
3955682Smarkm#
4055682Smarkm# These are the regression tests mostly created during the development
4155682Smarkm# of the BSD sed.  Each test should have a unique mark name, which is
4255682Smarkm# used for naming the corresponding file in regress.multitest.out.
4355682Smarkm
4455682SmarkmSRCDIR=$(dirname $0)
4555682Smarkm
4655682Smarkmmain()
4755682Smarkm{
4855682Smarkm	REGRESS=${SRCDIR}/regress.multitest.out
4955682Smarkm	DICT=/usr/share/dict/words
5055682Smarkm
5155682Smarkm	awk 'END { for (i = 1; i < 15; i++) print "l1_" i}' </dev/null >lines1
5255682Smarkm	awk 'END { for (i = 1; i < 10; i++) print "l2_" i}' </dev/null >lines2
5355682Smarkm
5455682Smarkm	echo "1..129"
5555682Smarkm
5655682Smarkm	exec 4>&1 5>&2
5755682Smarkm	tests
5855682Smarkm	exec 1>&4 2>&5
5955682Smarkm
6055682Smarkm	# Remove temporary files
6155682Smarkm	rm -f current.out lines[1-4] script[1-2]
6255682Smarkm}
6355682Smarkm
6455682Smarkmtests()
6555682Smarkm{
6655682Smarkm	SED=sed
6755682Smarkm	MARK=0
6855682Smarkm
6955682Smarkm	test_args
7055682Smarkm	test_addr
7155682Smarkm	test_group
7255682Smarkm	test_acid
7355682Smarkm	test_branch
7455682Smarkm	test_pattern
7555682Smarkm	test_print
7655682Smarkm	test_subst
7755682Smarkm	test_error
7855682Smarkm	# Handle the result of the last test
7955682Smarkm	result
8055682Smarkm}
8155682Smarkm
8255682Smarkm# Display a test's result
8355682Smarkmresult()
8455682Smarkm{
8555682Smarkm	if [ "$TODO" = '1' ] ; then
8655682Smarkm		TODO='TODO '
8755682Smarkm	else
8855682Smarkm		TODO=''
8955682Smarkm	fi
9055682Smarkm	if ! [ -r $REGRESS/${TESTNAME} ] ; then
9155682Smarkm		echo "Seeding $REGRESS/${TESTNAME} with current result" 1>&2
9255682Smarkm		cp current.out $REGRESS/${TESTNAME}
9355682Smarkm	fi
9455682Smarkm	if diff -c $REGRESS/${TESTNAME} current.out ; then
9555682Smarkm		echo "ok $MARK $TESTNAME # $TODO$COMMENT"
9655682Smarkm	else
9755682Smarkm		echo "not ok $MARK $TESTNAME # $TODO$COMMENT"
9855682Smarkm	fi 1>&4 2>&5
9955682Smarkm}
10055682Smarkm
10155682Smarkm# Mark the beginning of each test
10255682Smarkmmark()
10355682Smarkm{
10455682Smarkm	[ $MARK -gt 0 ] && result
10555682Smarkm	MARK=`expr $MARK + 1`
10655682Smarkm	TESTNAME=$1
10755682Smarkm	exec 1>&4 2>&5
10855682Smarkm	exec >"current.out"
10955682Smarkm}
11055682Smarkm
11155682Smarkmtest_args()
11255682Smarkm{
11355682Smarkm	COMMENT='Argument parsing - first type'
11455682Smarkm	mark '1.1'
11555682Smarkm	$SED 's/^/e1_/p' lines1
11655682Smarkm	mark '1.2' ; $SED -n 's/^/e1_/p' lines1
11755682Smarkm	mark '1.3'
11855682Smarkm	$SED 's/^/e1_/p' <lines1
11955682Smarkm	mark '1.4' ; $SED -n 's/^/e1_/p' <lines1
12055682Smarkm	COMMENT='Argument parsing - second type'
12155682Smarkm	mark '1.4.1'
12255682Smarkm	$SED -e '' <lines1
12355682Smarkm	echo 's/^/s1_/p' >script1
12455682Smarkm	echo 's/^/s2_/p' >script2
12555682Smarkm	mark '1.5'
12655682Smarkm	$SED -f script1 lines1
12755682Smarkm	mark '1.6'
12855682Smarkm	$SED -f script1 <lines1
12955682Smarkm	mark '1.7'
13055682Smarkm	$SED -e 's/^/e1_/p' lines1
13155682Smarkm	mark '1.8'
13255682Smarkm	$SED -e 's/^/e1_/p' <lines1
13355682Smarkm	mark '1.9' ; $SED -n -f script1 lines1
13455682Smarkm	mark '1.10' ; $SED -n -f script1 <lines1
13555682Smarkm	mark '1.11' ; $SED -n -e 's/^/e1_/p' lines1
13655682Smarkm	mark '1.12'
13755682Smarkm	$SED -n -e 's/^/e1_/p' <lines1
13855682Smarkm	mark '1.13'
13955682Smarkm	$SED -e 's/^/e1_/p' -e 's/^/e2_/p' lines1
14055682Smarkm	mark '1.14'
14155682Smarkm	$SED -f script1 -f script2 lines1
14255682Smarkm	mark '1.15'
14355682Smarkm	$SED -e 's/^/e1_/p' -f script1 lines1
14455682Smarkm	mark '1.16'
14555682Smarkm	$SED -e 's/^/e1_/p' lines1 lines1
14655682Smarkm	# POSIX D11.2:11251
14755682Smarkm	mark '1.17' ; $SED p <lines1 lines1
14855682Smarkmcat >script1 <<EOF
14955682Smarkm#n
15055682Smarkm# A comment
15155682Smarkm
15255682Smarkmp
15355682SmarkmEOF
15455682Smarkm	mark '1.18' ; $SED -f script1 <lines1 lines1
15555682Smarkm}
15655682Smarkm
15755682Smarkmtest_addr()
15855682Smarkm{
15955682Smarkm	COMMENT='Address ranges'
16055682Smarkm	mark '2.1' ; $SED -n -e '4p' lines1
16155682Smarkm	mark '2.2' ; $SED -n -e '20p' lines1 lines2
16255682Smarkm	mark '2.3' ; $SED -n -e '$p' lines1
16355682Smarkm	mark '2.4' ; $SED -n -e '$p' lines1 lines2
16455682Smarkm	mark '2.5' ; $SED -n -e '$a\
16555682Smarkmhello' /dev/null
16655682Smarkm	mark '2.6' ; $SED -n -e '$p' lines1 /dev/null lines2
16755682Smarkm	# Should not print anything
16855682Smarkm	mark '2.7' ; $SED -n -e '20p' lines1
16955682Smarkm	mark '2.8' ; $SED -n -e '/NOTFOUND/p' lines1
17055682Smarkm	mark '2.9' ; $SED -n '/l1_7/p' lines1
17155682Smarkm	mark '2.10' ; $SED -n ' /l1_7/ p' lines1
17255682Smarkm	mark '2.11' ; $SED -n '\_l1\_7_p' lines1
17355682Smarkm	mark '2.12' ; $SED -n '1,4p' lines1
17455682Smarkm	mark '2.13' ; $SED -n '1,$p' lines1 lines2
17555682Smarkm	mark '2.14' ; $SED -n '1,/l2_9/p' lines1 lines2
17655682Smarkm	mark '2.15' ; $SED -n '/4/,$p' lines1 lines2
17755682Smarkm	mark '2.16' ; $SED -n '/4/,20p' lines1 lines2
17855682Smarkm	mark '2.17' ; $SED -n '/4/,/10/p' lines1 lines2
17955682Smarkm	mark '2.18' ; $SED -n '/l2_3/,/l1_8/p' lines1 lines2
18055682Smarkm	mark '2.19' ; $SED -n '12,3p' lines1 lines2
18155682Smarkm	mark '2.20' ; $SED -n '/l1_7/,3p' lines1 lines2
18255682Smarkm	mark '2.21' ; $SED -n '13,+4p' lines1 lines2
18355682Smarkm	mark '2.22' ; $SED -n '/l1_6/,+2p' lines1 lines2
18455682Smarkm}
18555682Smarkm
18655682Smarkmtest_group()
18755682Smarkm{
18855682Smarkm	COMMENT='Brace and other grouping'
18955682Smarkm	mark '3.1' ; $SED -e '
19055682Smarkm4,12 {
19155682Smarkm	s/^/^/
19255682Smarkm	s/$/$/
19355682Smarkm	s/_/T/
19455682Smarkm}' lines1
19555682Smarkm	mark '3.2' ; $SED -e '
19655682Smarkm4,12 {
19755682Smarkm	s/^/^/
19855682Smarkm	/6/,/10/ {
19955682Smarkm		s/$/$/
20055682Smarkm		/8/ s/_/T/
20155682Smarkm	}
20255682Smarkm}' lines1
20355682Smarkm	mark '3.3' ; $SED -e '
20455682Smarkm4,12 !{
20555682Smarkm	s/^/^/
20655682Smarkm	/6/,/10/ !{
20755682Smarkm		s/$/$/
20855682Smarkm		/8/ !s/_/T/
20955682Smarkm	}
21055682Smarkm}' lines1
21155682Smarkm	mark '3.4' ; $SED -e '4,12!s/^/^/' lines1
21255682Smarkm}
21355682Smarkm
21455682Smarkmtest_acid()
21555682Smarkm{
21655682Smarkm	COMMENT='Commands a c d and i'
21755682Smarkm	mark '4.1' ; $SED -n -e '
21855682Smarkms/^/before_i/p
21955682Smarkm20i\
22055682Smarkminserted
22155682Smarkms/^/after_i/p
22255682Smarkm' lines1 lines2
22355682Smarkm	mark '4.2' ; $SED -n -e '
22455682Smarkm5,12s/^/5-12/
22555682Smarkms/^/before_a/p
22655682Smarkm/5-12/a\
22755682Smarkmappended
22855682Smarkms/^/after_a/p
22955682Smarkm' lines1 lines2
23055682Smarkm	mark '4.3'
23155682Smarkm	$SED -n -e '
23255682Smarkms/^/^/p
23355682Smarkm/l1_/a\
23455682Smarkmappended
23555682Smarkm8,10N
23655682Smarkms/$/$/p
23755682Smarkm' lines1 lines2
23855682Smarkm	mark '4.4' ; $SED -n -e '
23955682Smarkmc\
24055682Smarkmhello
24155682Smarkm' lines1
24255682Smarkm	mark '4.5' ; $SED -n -e '
24355682Smarkm8c\
24455682Smarkmhello
24555682Smarkm' lines1
24655682Smarkm	mark '4.6' ; $SED -n -e '
24755682Smarkm3,14c\
24855682Smarkmhello
24955682Smarkm' lines1
25055682Smarkm# SunOS and GNU sed behave differently.   We follow POSIX
25155682Smarkm	mark '4.7' ; $SED -n -e '
25255682Smarkm8,3c\
25355682Smarkmhello
25455682Smarkm' lines1
25555682Smarkm	mark '4.8' ; $SED d <lines1
25655682Smarkm}
25755682Smarkm
25855682Smarkmtest_branch()
25955682Smarkm{
26055682Smarkm	COMMENT='Labels and branching'
26155682Smarkm	mark '5.1' ; $SED -n -e '
26255682Smarkmb label4
26355682Smarkm:label3
26455682Smarkms/^/label3_/p
26555682Smarkmb end
26655682Smarkm:label4
26755682Smarkm2,12b label1
26855682Smarkmb label2
26955682Smarkm:label1
27055682Smarkms/^/label1_/p
27155682Smarkmb
27255682Smarkm:label2
27355682Smarkms/^/label2_/p
27455682Smarkmb label3
27555682Smarkm:end
27655682Smarkm' lines1
27755682Smarkm	mark '5.2'
27855682Smarkm	$SED -n -e '
27955682Smarkms/l1_/l2_/
28055682Smarkmt ok
28155682Smarkmb
28255682Smarkm:ok
28355682Smarkms/^/tested /p
28455682Smarkm' lines1 lines2
28555682Smarkm# SunOS and GNU sed behave as follows: lines 9-$ aren't printed at all
28655682Smarkm	mark '5.3' ; $SED -n -e '
28755682Smarkm5,8b inside
28855682Smarkm1,5 {
28955682Smarkm	s/^/^/p
29055682Smarkm	:inside
29155682Smarkm	s/$/$/p
29255682Smarkm}
29355682Smarkm' lines1
29455682Smarkm# Check that t clears the substitution done flag
29555682Smarkm	mark '5.4' ; $SED -n -e '
29655682Smarkm1,8s/^/^/
29755682Smarkmt l1
29855682Smarkm:l1
29955682Smarkmt l2
30055682Smarkms/$/$/p
30155682Smarkmb
30255682Smarkm:l2
30355682Smarkms/^/ERROR/
30455682Smarkm' lines1
30555682Smarkm# Check that reading a line clears the substitution done flag
30655682Smarkm	mark '5.5'
30755682Smarkm	$SED -n -e '
30855682Smarkmt l2
30955682Smarkm1,8s/^/^/p
31055682Smarkm2,7N
31155682Smarkmb
31255682Smarkm:l2
31355682Smarkms/^/ERROR/p
31455682Smarkm' lines1
31555682Smarkm	mark '5.6' ; $SED 5q lines1
31655682Smarkm	mark '5.7' ; $SED -e '
31755682Smarkm5i\
31855682Smarkmhello
31955682Smarkm5q' lines1
32055682Smarkm# Branch across block boundary
32155682Smarkm	mark '5.8' ; $SED -e '
32255682Smarkm{
32355682Smarkm:b
32455682Smarkm}
32555682Smarkms/l/m/
32655682Smarkmtb' lines1
32755682Smarkm}
32855682Smarkm
32955682Smarkmtest_pattern()
33055682Smarkm{
33155682SmarkmCOMMENT='Pattern space commands'
33255682Smarkm# Check that the pattern space is deleted
33355682Smarkm	mark '6.1' ; $SED -n -e '
33455682Smarkmc\
33555682Smarkmchanged
33655682Smarkmp
33755682Smarkm' lines1
33855682Smarkm	mark '6.2' ; $SED -n -e '
33955682Smarkm4d
34055682Smarkmp
34155682Smarkm' lines1
34255682Smarkm	mark '6.3'
34355682Smarkm	$SED -e 'N;N;N;D' lines1
34455682Smarkm	mark '6.4' ; $SED -e '
34555682Smarkm2h
34655682Smarkm3H
34755682Smarkm4g
34855682Smarkm5G
34955682Smarkm6x
35055682Smarkm6p
35155682Smarkm6x
35255682Smarkm6p
35355682Smarkm' lines1
35455682Smarkm	mark '6.5' ; $SED -e '4n' lines1
35555682Smarkm	mark '6.6' ; $SED -n -e '4n' lines1
35655682Smarkm}
35755682Smarkm
35855682Smarkmtest_print()
35955682Smarkm{
36055682Smarkm	COMMENT='Print and file routines'
36155682Smarkm	awk 'END {for (i = 1; i < 256; i++) printf("%c", i);print "\n"}' \
36255682Smarkm		</dev/null >lines3
36355682Smarkm	# GNU and SunOS sed behave differently here
36455682Smarkm	mark '7.1'
36555682Smarkm	$SED -n l lines3
36655682Smarkm	mark '7.2' ; $SED -e '/l2_/=' lines1 lines2
36755682Smarkm	rm -f lines4
36855682Smarkm	mark '7.3' ; $SED -e '3,12w lines4' lines1
36955682Smarkm	COMMENT='w results'
37055682Smarkm	cat lines4
37155682Smarkm	mark '7.4' ; $SED -e '4r lines2' lines1
37255682Smarkm	mark '7.5' ; $SED -e '5r /dev/dds' lines1
37355682Smarkm	mark '7.6' ; $SED -e '6r /dev/null' lines1
37455682Smarkm	mark '7.7'
37555682Smarkm	sed '200q' $DICT | sed 's$.*$s/^/&/w tmpdir/&$' >script1
37655682Smarkm	rm -rf tmpdir
37755682Smarkm	mkdir tmpdir
37855682Smarkm	$SED -f script1 lines1
37955682Smarkm	cat tmpdir/*
38055682Smarkm	rm -rf tmpdir
38155682Smarkm	mark '7.8'
38255682Smarkm	echo line1 > lines3
38355682Smarkm	echo "" >> lines3
38455682Smarkm	TODO=1
38555682Smarkm	$SED -n -e '$p' lines3 /dev/null
38655682Smarkm		
38755682Smarkm}
38855682Smarkm
38955682Smarkmtest_subst()
39055682Smarkm{
39155682Smarkm	COMMENT='Substitution commands'
39255682Smarkm	mark '8.1' ; $SED -e 's/./X/g' lines1
39355682Smarkm	mark '8.2' ; $SED -e 's,.,X,g' lines1
39455682Smarkm# SunOS sed thinks we are escaping . as wildcard, not as separator
39555682Smarkm	mark '8.3'
39655682Smarkm	$SED -e 's.\..X.g' lines1
39755682Smarkm	mark '8.4' ; $SED -e 's/[\/]/Q/' lines1
39855682Smarkm	mark '8.5' ; $SED -e 's_\__X_' lines1
39955682Smarkm	mark '8.6' ; $SED -e 's/./(&)/g' lines1
40055682Smarkm	mark '8.7' ; $SED -e 's/./(\&)/g' lines1
40155682Smarkm	mark '8.8' ; $SED -e 's/\(.\)\(.\)\(.\)/x\3x\2x\1/g' lines1
40255682Smarkm	mark '8.9' ; $SED -e 's/_/u0\
40355682Smarkmu1\
40455682Smarkmu2/g' lines1
40555682Smarkm	mark '8.10'
40655682Smarkm	$SED -e 's/./X/4' lines1
40755682Smarkm	rm -f lines4
40855682Smarkm	mark '8.11' ; $SED -e 's/1/X/w lines4' lines1
40955682Smarkm	COMMENT='s wfile results'
41055682Smarkm	cat lines4
41155682Smarkm	mark '8.12' ; $SED -e 's/[123]/X/g' lines1
41255682Smarkm	mark '8.13' ; $SED -e 'y/0123456789/9876543210/' lines1
41355682Smarkm	mark '8.14' ; 
41455682Smarkm	$SED -e 'y10\123456789198765432\101' lines1
41555682Smarkm	mark '8.15' ; $SED -e '1N;2y/\n/X/' lines1
41655682Smarkm	mark '8.16'
41755682Smarkm	echo 'eeefff' | $SED -e '
41855682Smarkm		p
41955682Smarkm		s/e/X/p
42055682Smarkm		:x
42155682Smarkm		s//Y/p 
42255682Smarkm		# Establish limit counter in the hold space
42355682Smarkm		# GNU sed version 3.02 enters into an infinite loop here
42455682Smarkm		x 
42555682Smarkm		/.\{10\}/ {
42655682Smarkm			s/.*/ERROR/
42755682Smarkm			b
42855682Smarkm		}
42955682Smarkm		s/.*/&./
43055682Smarkm		x 
43155682Smarkm		/f/bx
43255682Smarkm	'
43355682Smarkm	# POSIX does not say that this should work,
43455682Smarkm	# but it does for GNU, BSD, and SunOS
43555682Smarkm	mark '8.17' ; $SED -e 's/[/]/Q/' lines1
43655682Smarkm
43755682Smarkm	COMMENT='[ as an s delimiter and its escapes'
43855682Smarkm	mark '8.18' ; $SED -e 's[_[X[' lines1
43955682Smarkm	# This is a matter of interpretation
44055682Smarkm	# POSIX 1003.1, 2004 says "Within the BRE and the replacement,
44155682Smarkm	# the BRE delimiter itself can be used as a *literal* character
44255682Smarkm	# if it is preceded by a backslash"
44355682Smarkm	# SunOS 5.1 /usr/bin/sed and Mac OS X follow the literal POSIX
44455682Smarkm	# interpretation.
44555682Smarkm	# GNU sed version 4.1.5 treats \[ as the beginning of a character
44655682Smarkm	# set specification (both with --posix and without).
44755682Smarkm	mark '8.19' ; sed 's/l/[/' lines1 | $SED -e 's[\[.[X['
44855682Smarkm	mark '8.20' ; sed 's/l/[/' lines1 | $SED -e 's[\[.[X\[['
44955682Smarkm	COMMENT='\ in y command'
45055682Smarkm	mark '8.21'
45155682Smarkm	echo 'a\b(c' |
45255682Smarkm	$SED 'y%ABCDEFGHIJKLMNOPQRSTUVWXYZ, /\\()"%abcdefghijklmnopqrstuvwxyz,------%'
45355682Smarkm	COMMENT='\n in a character class and a BRE'
45455682Smarkm	mark '8.22' ; (echo 1; echo 2) | $SED -n '1{;N;s/[\n]/X/;p;}'
45555682Smarkm	mark '8.23' ; (echo 1; echo 2) | $SED -n '1{;N;s/\n/X/;p;}'
45655682Smarkm}
45755682Smarkm
45855682Smarkmtest_error()
45955682Smarkm{
46055682Smarkm	COMMENT='Error cases'
46155682Smarkm	mark '9.1' ; $SED -x 2>/dev/null ; echo $?
46255682Smarkm	mark '9.2' ; $SED -f 2>/dev/null ; echo $?
46355682Smarkm	mark '9.3' ; $SED -e 2>/dev/null ; echo $?
46455682Smarkm	mark '9.4' ; $SED -f /dev/xyzzyxyzy 2>/dev/null ; echo $?
46555682Smarkm	mark '9.5' ; $SED p /dev/xyzzyxyzy 2>/dev/null ; echo $?
46655682Smarkm	mark '9.6' ; $SED -f /bin/sh 2>/dev/null ; echo $?
46755682Smarkm	mark '9.7' ; $SED '{' 2>/dev/null ; echo $?
46855682Smarkm	mark '9.8' ; $SED '{' 2>/dev/null ; echo $?
46955682Smarkm	mark '9.9' ; $SED '/hello/' 2>/dev/null ; echo $?
47055682Smarkm	mark '9.10' ; $SED '1,/hello/' 2>/dev/null ; echo $?
47155682Smarkm	mark '9.11' ; $SED -e '-5p' 2>/dev/null ; echo $?
47255682Smarkm	mark '9.12' ; $SED '/jj' 2>/dev/null ; echo $?
47355682Smarkm	mark '9.13' ; $SED 'a hello' 2>/dev/null ; echo $?
47455682Smarkm	mark '9.14' ; $SED 'a \ hello' 2>/dev/null ; echo $?
47555682Smarkm	mark '9.15' ; $SED 'b foo' 2>/dev/null ; echo $?
47655682Smarkm	mark '9.16' ; $SED 'd hello' 2>/dev/null ; echo $?
47755682Smarkm	mark '9.17' ; $SED 's/aa' 2>/dev/null ; echo $?
47855682Smarkm	mark '9.18' ; $SED 's/aa/' 2>/dev/null ; echo $?
47955682Smarkm	mark '9.19' ; $SED 's/a/b' 2>/dev/null ; echo $?
48055682Smarkm	mark '9.20' ; $SED 's/a/b/c/d' 2>/dev/null ; echo $?
48155682Smarkm	mark '9.21' ; $SED 's/a/b/ 1 2' 2>/dev/null ; echo $?
48255682Smarkm	mark '9.22' ; $SED 's/a/b/ 1 g' 2>/dev/null ; echo $?
48355682Smarkm	mark '9.23' ; $SED 's/a/b/w' 2>/dev/null ; echo $?
48455682Smarkm	mark '9.24' ; $SED 'y/aa' 2>/dev/null ; echo $?
48555682Smarkm	mark '9.25' ; $SED 'y/aa/b/' 2>/dev/null ; echo $?
48655682Smarkm	mark '9.26' ; $SED 'y/aa/' 2>/dev/null ; echo $?
48755682Smarkm	mark '9.27' ; $SED 'y/a/b' 2>/dev/null ; echo $?
48855682Smarkm	mark '9.28' ; $SED 'y/a/b/c/d' 2>/dev/null ; echo $?
48955682Smarkm	mark '9.29' ; $SED '!' 2>/dev/null ; echo $?
49055682Smarkm	mark '9.30' ; $SED supercalifrangolisticexprialidociussupercalifrangolisticexcius 2>/dev/null ; echo $?
49155682Smarkm	mark '9.31' ; $SED '' /dev/null 2>/dev/null ; echo $?
49255682Smarkm}
49355682Smarkm
49455682Smarkmmain
49555682Smarkm