155998Sbostic#!/bin/sh - 255998Sbostic# 355998Sbostic# Copyright (c) 1992 Diomidis Spinellis. 455998Sbostic# Copyright (c) 1992 The Regents of the University of California. 555998Sbostic# All rights reserved. 655998Sbostic# 755998Sbostic# %sccs.include.redist.sh% 855998Sbostic# 9*56072Sbostic# @(#)sed.test 5.5 (Berkeley) 08/28/92 1055998Sbostic# 1155998Sbostic 1255998Sbostic# sed Regression Tests 1355998Sbostic# 1455998Sbostic# The following files are created: 1555998Sbostic# lines[1-4], script1, script2 1655998Sbostic# Two directories *.out contain the test results 1755998Sbostic 1855998Sbosticmain() 1955998Sbostic{ 20*56072Sbostic BASE=/usr/old/bin/sed 2155998Sbostic BASELOG=sed.out 2255998Sbostic TEST=../obj/sed 2355998Sbostic TESTLOG=nsed.out 2455998Sbostic DICT=/usr/share/dict/words 2555998Sbostic 2656007Sbostic test_error | more 2756007Sbostic 2855998Sbostic awk 'END { for (i = 1; i < 15; i++) print "l1_" i}' </dev/null >lines1 2955998Sbostic awk 'END { for (i = 1; i < 10; i++) print "l2_" i}' </dev/null >lines2 3055998Sbostic 3155998Sbostic exec 4>&1 5>&2 3255998Sbostic 3355998Sbostic # Set these flags to get messages about known problems 3455998Sbostic BSD=1 3555998Sbostic GNU=0 3655998Sbostic SUN=0 3755998Sbostic tests $BASE $BASELOG 3855998Sbostic 3955998Sbostic BSD=0 4055998Sbostic GNU=0 4155998Sbostic SUN=0 4255998Sbostic tests $TEST $TESTLOG 4355998Sbostic exec 1>&4 2>&5 4455998Sbostic diff -c $BASELOG $TESTLOG | more 4555998Sbostic} 4655998Sbostic 4755998Sbostictests() 4855998Sbostic{ 4955998Sbostic SED=$1 5055998Sbostic DIR=$2 5155998Sbostic rm -rf $DIR 5255998Sbostic mkdir $DIR 5355998Sbostic MARK=100 5455998Sbostic 5555998Sbostic test_args 5655998Sbostic test_addr 5755998Sbostic echo Testing commands 5855998Sbostic test_group 5956006Sbostic test_acid 6055998Sbostic test_branch 6155998Sbostic test_pattern 6255998Sbostic test_print 6355998Sbostic test_subst 6455998Sbostic} 6555998Sbostic 6655998Sbosticmark() 6755998Sbostic{ 6855998Sbostic MARK=`expr $MARK + 1` 6955998Sbostic exec 1>&4 2>&5 7055998Sbostic exec >"$DIR/${MARK}_$1" 7155998Sbostic echo "Test $1:$MARK" 7255998Sbostic # Uncomment this line to match tests with sed error messages 7356007Sbostic echo "Test $1:$MARK" >&5 7455998Sbostic} 7555998Sbostic 7655998Sbostictest_args() 7755998Sbostic{ 7855998Sbostic mark '1.1' 7955998Sbostic echo Testing argument parsing 8055998Sbostic echo First type 8155998Sbostic if [ $SUN -eq 1 ] ; then 8255998Sbostic echo SunOS sed prints only with -n 8355998Sbostic else 8455998Sbostic $SED 's/^/e1_/p' lines1 8555998Sbostic fi 8655998Sbostic mark '1.2' ; $SED -n 's/^/e1_/p' lines1 8755998Sbostic mark '1.3' 8855998Sbostic if [ $SUN -eq 1 ] ; then 8955998Sbostic echo SunOS sed prints only with -n 9055998Sbostic else 9155998Sbostic $SED 's/^/e1_/p' <lines1 9255998Sbostic fi 9355998Sbostic mark '1.4' ; $SED -n 's/^/e1_/p' <lines1 9455998Sbostic echo Second type 9555998Sbostic mark '1.4.1' 9655998Sbostic if [ $SUN -eq 1 ] ; then 9755998Sbostic echo SunOS sed fails this 9855998Sbostic fi 9955998Sbostic $SED -e '' <lines1 10055998Sbostic echo 's/^/s1_/p' >script1 10155998Sbostic echo 's/^/s2_/p' >script2 10255998Sbostic mark '1.5' 10355998Sbostic if [ $SUN -eq 1 ] ; then 10455998Sbostic echo SunOS sed prints only with -n 10555998Sbostic else 10655998Sbostic $SED -f script1 lines1 10755998Sbostic fi 10855998Sbostic mark '1.6' 10955998Sbostic if [ $SUN -eq 1 ] ; then 11055998Sbostic echo SunOS sed prints only with -n 11155998Sbostic else 11255998Sbostic $SED -f script1 <lines1 11355998Sbostic fi 11455998Sbostic mark '1.7' 11555998Sbostic if [ $SUN -eq 1 ] ; then 11655998Sbostic echo SunOS sed prints only with -n 11755998Sbostic else 11855998Sbostic $SED -e 's/^/e1_/p' lines1 11955998Sbostic fi 12055998Sbostic mark '1.8' 12155998Sbostic if [ $SUN -eq 1 ] ; then 12255998Sbostic echo SunOS sed prints only with -n 12355998Sbostic else 12455998Sbostic $SED -e 's/^/e1_/p' <lines1 12555998Sbostic fi 12655998Sbostic mark '1.9' ; $SED -n -f script1 lines1 12755998Sbostic mark '1.10' ; $SED -n -f script1 <lines1 12855998Sbostic mark '1.11' ; $SED -n -e 's/^/e1_/p' lines1 12955998Sbostic mark '1.12' 13055998Sbostic if [ $SUN -eq 1 ] ; then 13155998Sbostic echo SunOS sed prints only with -n 13255998Sbostic else 13355998Sbostic $SED -n -e 's/^/e1_/p' <lines1 13455998Sbostic fi 13555998Sbostic mark '1.13' 13655998Sbostic if [ $SUN -eq 1 ] ; then 13755998Sbostic echo SunOS sed prints only with -n 13855998Sbostic else 13955998Sbostic $SED -e 's/^/e1_/p' -e 's/^/e2_/p' lines1 14055998Sbostic fi 14155998Sbostic mark '1.14' 14255998Sbostic if [ $SUN -eq 1 ] ; then 14355998Sbostic echo SunOS sed prints only with -n 14455998Sbostic else 14555998Sbostic $SED -f script1 -f script2 lines1 14655998Sbostic fi 14755998Sbostic mark '1.15' 14855998Sbostic if [ $GNU -eq 1 -o $SUN -eq 1 ] ; then 14955998Sbostic echo GNU and SunOS sed fail this following older POSIX draft 15055998Sbostic else 15155998Sbostic $SED -e 's/^/e1_/p' -f script1 lines1 15255998Sbostic fi 15355998Sbostic mark '1.16' 15455998Sbostic if [ $SUN -eq 1 ] ; then 15555998Sbostic echo SunOS sed prints only with -n 15655998Sbostic else 15755998Sbostic $SED -e 's/^/e1_/p' lines1 lines1 15855998Sbostic fi 15955998Sbostic # POSIX D11.2:11251 16055998Sbostic mark '1.17' ; $SED p <lines1 lines1 16155998Sbosticcat >script1 <<EOF 16255998Sbostic#n 16355998Sbostic# A comment 16455998Sbostic 16555998Sbosticp 16655998SbosticEOF 16755998Sbostic mark '1.18' ; $SED -f script1 <lines1 lines1 16855998Sbostic} 16955998Sbostic 17055998Sbostictest_addr() 17155998Sbostic{ 17255998Sbostic echo Testing address ranges 17355998Sbostic mark '2.1' ; $SED -n -e '4p' lines1 17455998Sbostic mark '2.2' ; $SED -n -e '20p' lines1 lines2 17555998Sbostic mark '2.3' ; $SED -n -e '$p' lines1 17655998Sbostic mark '2.4' ; $SED -n -e '$p' lines1 lines2 17755998Sbostic mark '2.5' ; $SED -n -e '$a\ 17855998Sbostichello' /dev/null 17955998Sbostic mark '2.6' ; $SED -n -e '$p' lines1 /dev/null lines2 18055998Sbostic # Should not print anything 18155998Sbostic mark '2.7' ; $SED -n -e '20p' lines1 18255998Sbostic mark '2.8' ; $SED -n -e '0p' lines1 18355998Sbostic mark '2.9' ; $SED -n '/l1_7/p' lines1 18455998Sbostic mark '2.10' ; $SED -n ' /l1_7/ p' lines1 18555998Sbostic mark '2.11' 18655998Sbostic if [ $BSD -eq 1 ] ; then 18755998Sbostic echo BSD sed fails this test 18855998Sbostic fi 18955998Sbostic if [ $GNU -eq 1 ] ; then 19055998Sbostic echo GNU sed fails this 19155998Sbostic fi 19255998Sbostic $SED -n '\_l1\_7_p' lines1 19355998Sbostic mark '2.12' ; $SED -n '1,4p' lines1 19455998Sbostic mark '2.13' ; $SED -n '1,$p' lines1 lines2 19555998Sbostic mark '2.14' ; $SED -n '1,/l2_9/p' lines1 lines2 19655998Sbostic mark '2.15' ; $SED -n '/4/,$p' lines1 lines2 19755998Sbostic mark '2.16' ; $SED -n '/4/,20p' lines1 lines2 19855998Sbostic mark '2.17' ; $SED -n '/4/,/10/p' lines1 lines2 19955998Sbostic mark '2.18' ; $SED -n '/l2_3/,/l1_8/p' lines1 lines2 20055998Sbostic mark '2.19' 20155998Sbostic if [ $GNU -eq 1 ] ; then 20255998Sbostic echo GNU sed fails this 20355998Sbostic fi 20455998Sbostic $SED -n '12,3p' lines1 lines2 20555998Sbostic mark '2.20' 20655998Sbostic if [ $GNU -eq 1 ] ; then 20755998Sbostic echo GNU sed fails this 20855998Sbostic fi 20955998Sbostic $SED -n '/l1_7/,3p' lines1 lines2 21055998Sbostic} 21155998Sbostic 21255998Sbostictest_group() 21355998Sbostic{ 21455998Sbostic echo Brace and other grouping 21555998Sbostic mark '3.1' ; $SED -e ' 21655998Sbostic4,12 { 21755998Sbostic s/^/^/ 21855998Sbostic s/$/$/ 21955998Sbostic s/_/T/ 22055998Sbostic}' lines1 22155998Sbostic mark '3.2' ; $SED -e ' 22255998Sbostic4,12 { 22355998Sbostic s/^/^/ 22455998Sbostic /6/,/10/ { 22555998Sbostic s/$/$/ 22655998Sbostic /8/ s/_/T/ 22755998Sbostic } 22855998Sbostic}' lines1 22955998Sbostic mark '3.3' ; $SED -e ' 23055998Sbostic4,12 !{ 23155998Sbostic s/^/^/ 23255998Sbostic /6/,/10/ !{ 23355998Sbostic s/$/$/ 23455998Sbostic /8/ !s/_/T/ 23555998Sbostic } 23655998Sbostic}' lines1 23755998Sbostic mark '3.4' ; $SED -e '4,12!s/^/^/' lines1 23855998Sbostic} 23955998Sbostic 24056006Sbostictest_acid() 24155998Sbostic{ 24256006Sbostic echo Testing a c d and i commands 24355998Sbostic mark '4.1' ; $SED -n -e ' 24455998Sbostics/^/before_i/p 24555998Sbostic20i\ 24655998Sbosticinserted 24755998Sbostics/^/after_i/p 24855998Sbostic' lines1 lines2 24955998Sbostic mark '4.2' ; $SED -n -e ' 25055998Sbostic5,12s/^/5-12/ 25155998Sbostics/^/before_a/p 25255998Sbostic/5-12/a\ 25355998Sbosticappended 25455998Sbostics/^/after_a/p 25555998Sbostic' lines1 lines2 25655998Sbostic mark '4.3' 25755998Sbostic if [ $GNU -eq 1 ] ; then 25855998Sbostic echo GNU sed fails this 25955998Sbostic fi 26055998Sbostic $SED -n -e ' 26155998Sbostics/^/^/p 26255998Sbostic/l1_/a\ 26355998Sbosticappended 26455998Sbostic8,10N 26555998Sbostics/$/$/p 26655998Sbostic' lines1 lines2 26755998Sbostic mark '4.4' ; $SED -n -e ' 26855998Sbosticc\ 26955998Sbostichello 27055998Sbostic' lines1 27155998Sbostic mark '4.5' ; $SED -n -e ' 27255998Sbostic8c\ 27355998Sbostichello 27455998Sbostic' lines1 27555998Sbostic mark '4.6' ; $SED -n -e ' 27655998Sbostic3,14c\ 27755998Sbostichello 27855998Sbostic' lines1 27955998Sbostic# SunOS and GNU sed behave differently. We follow POSIX 28055998Sbostic# mark '4.7' ; $SED -n -e ' 28155998Sbostic#8,3c\ 28255998Sbostic#hello 28355998Sbostic#' lines1 28456006Sbostic mark '4.8' ; $SED d <lines1 28555998Sbostic} 28655998Sbostic 28755998Sbostictest_branch() 28855998Sbostic{ 28955998Sbostic echo Testing labels and branching 29055998Sbostic mark '5.1' ; $SED -n -e ' 29155998Sbosticb label4 29255998Sbostic:label3 29355998Sbostics/^/label3_/p 29455998Sbosticb end 29555998Sbostic:label4 29655998Sbostic2,12b label1 29755998Sbosticb label2 29855998Sbostic:label1 29955998Sbostics/^/label1_/p 30055998Sbosticb 30155998Sbostic:label2 30255998Sbostics/^/label2_/p 30355998Sbosticb label3 30455998Sbostic:end 30555998Sbostic' lines1 30655998Sbostic mark '5.2' 30755998Sbostic if [ $BSD -eq 1 ] ; then 30855998Sbostic echo BSD sed fails this test 30955998Sbostic fi 31055998Sbostic $SED -n -e ' 31155998Sbostics/l1_/l2_/ 31255998Sbostict ok 31355998Sbosticb 31455998Sbostic:ok 31555998Sbostics/^/tested /p 31655998Sbostic' lines1 lines2 31755998Sbostic# SunOS sed behaves differently here. Clarification needed. 31855998Sbostic# mark '5.3' ; $SED -n -e ' 31955998Sbostic#5,8b inside 32055998Sbostic#1,5 { 32155998Sbostic# s/^/^/p 32255998Sbostic# :inside 32355998Sbostic# s/$/$/p 32455998Sbostic#} 32555998Sbostic#' lines1 32655998Sbostic# Check that t clears the substitution done flag 32755998Sbostic mark '5.4' ; $SED -n -e ' 32855998Sbostic1,8s/^/^/ 32955998Sbostict l1 33055998Sbostic:l1 33155998Sbostict l2 33255998Sbostics/$/$/p 33355998Sbosticb 33455998Sbostic:l2 33555998Sbostics/^/ERROR/ 33655998Sbostic' lines1 33755998Sbostic# Check that reading a line clears the substitution done flag 33855998Sbostic mark '5.5' 33955998Sbostic if [ $BSD -eq 1 ] ; then 34055998Sbostic echo BSD sed fails this test 34155998Sbostic fi 34255998Sbostic $SED -n -e ' 34355998Sbostict l2 34455998Sbostic1,8s/^/^/p 34555998Sbostic2,7N 34655998Sbosticb 34755998Sbostic:l2 34855998Sbostics/^/ERROR/p 34955998Sbostic' lines1 35055998Sbostic mark '5.6' ; $SED 5q lines1 35155998Sbostic mark '5.7' ; $SED -e ' 35255998Sbostic5i\ 35355998Sbostichello 35455998Sbostic5q' lines1 35555998Sbostic} 35655998Sbostic 35755998Sbostictest_pattern() 35855998Sbostic{ 35955998Sbosticecho Pattern space commands 36055998Sbostic# Check that the pattern space is deleted 36155998Sbostic mark '6.1' ; $SED -n -e ' 36255998Sbosticc\ 36355998Sbosticchanged 36455998Sbosticp 36555998Sbostic' lines1 36655998Sbostic mark '6.2' ; $SED -n -e ' 36755998Sbostic4d 36855998Sbosticp 36955998Sbostic' lines1 37055998Sbostic# SunOS sed refused to print here 37155998Sbostic# mark '6.3' ; $SED -e ' 37255998Sbostic#N 37355998Sbostic#N 37455998Sbostic#N 37555998Sbostic#D 37655998Sbostic#P 37755998Sbostic#4p 37855998Sbostic#' lines1 37955998Sbostic mark '6.4' ; $SED -e ' 38055998Sbostic2h 38155998Sbostic3H 38255998Sbostic4g 38355998Sbostic5G 38455998Sbostic6x 38555998Sbostic6p 38655998Sbostic6x 38755998Sbostic6p 38855998Sbostic' lines1 38955998Sbostic mark '6.5' ; $SED -e '4n' lines1 39055998Sbostic mark '6.6' ; $SED -n -e '4n' lines1 39155998Sbostic} 39255998Sbostic 39355998Sbostictest_print() 39455998Sbostic{ 39555998Sbostic echo Testing print and file routines 39655998Sbostic awk 'END {for (i = 1; i < 256; i++) printf("%c", i);print "\n"}' \ 39755998Sbostic </dev/null >lines3 39855998Sbostic # GNU and SunOS sed behave differently here 39955998Sbostic mark '7.1' 40055998Sbostic if [ $BSD -eq 1 ] ; then 40155998Sbostic echo 'BSD sed drops core on this one; TEST SKIPPED' 40255998Sbostic else 40355998Sbostic $SED -n l lines3 40455998Sbostic fi 40555998Sbostic mark '7.2' ; $SED -e '/l2_/=' lines1 lines2 40655998Sbostic rm -f lines4 40755998Sbostic mark '7.3' ; $SED -e '3,12w lines4' lines1 40855998Sbostic echo w results 40955998Sbostic cat lines4 41055998Sbostic mark '7.4' ; $SED -e '4r lines2' lines1 41155998Sbostic mark '7.5' ; $SED -e '5r /dev/dds' lines1 41255998Sbostic mark '7.6' ; $SED -e '6r /dev/null' lines1 41355998Sbostic mark '7.7' 41455998Sbostic if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then 41555998Sbostic echo BSD, GNU and SunOS cannot pass this one 41655998Sbostic else 41755998Sbostic sed '200q' $DICT | sed 's$.*$s/^/&/w tmpdir/&$' >script1 41855998Sbostic rm -rf tmpdir 41955998Sbostic mkdir tmpdir 42055998Sbostic $SED -f script1 lines1 42155998Sbostic cat tmpdir/* 42255998Sbostic rm -rf tmpdir 42355998Sbostic fi 42455998Sbostic mark '7.8' 42555998Sbostic if [ $BSD -eq 1 ] ; then 42655998Sbostic echo BSD sed cannot pass 7.7 42755998Sbostic else 42855998Sbostic echo line1 > lines3 42955998Sbostic echo "" >> lines3 43055998Sbostic $SED -n -e '$p' lines3 /dev/null 43155998Sbostic fi 43255998Sbostic 43355998Sbostic} 43455998Sbostic 43555998Sbostictest_subst() 43655998Sbostic{ 43755998Sbostic echo Testing substitution commands 43855998Sbostic mark '8.1' ; $SED -e 's/./X/g' lines1 43955998Sbostic mark '8.2' ; $SED -e 's,.,X,g' lines1 44055998Sbostic# GNU and SunOS sed thinks we are escaping . as wildcard, not as separator 44155998Sbostic# mark '8.3' ; $SED -e 's.\..X.g' lines1 44255998Sbostic# POSIX does not say that this should work 44355998Sbostic# mark '8.4' ; $SED -e 's/[/]/Q/' lines1 44455998Sbostic mark '8.4' ; $SED -e 's/[\/]/Q/' lines1 44555998Sbostic mark '8.5' ; $SED -e 's_\__X_' lines1 44655998Sbostic mark '8.6' ; $SED -e 's/./(&)/g' lines1 44755998Sbostic mark '8.7' ; $SED -e 's/./(\&)/g' lines1 44855998Sbostic mark '8.8' ; $SED -e 's/\(.\)\(.\)\(.\)/x\3x\2x\1/g' lines1 44955998Sbostic mark '8.9' ; $SED -e 's/_/u0\ 45055998Sbosticu1\ 45155998Sbosticu2/g' lines1 45255998Sbostic mark '8.10' 45355998Sbostic if [ $BSD -eq 1 -o $GNU -eq 1 ] ; then 45455998Sbostic echo 'BSD/GNU sed do not understand digit flags on s commands' 45555998Sbostic fi 45655998Sbostic $SED -e 's/./X/4' lines1 45755998Sbostic rm -f lines4 45855998Sbostic mark '8.11' ; $SED -e 's/1/X/w lines4' lines1 45955998Sbostic echo s wfile results 46055998Sbostic cat lines4 46155998Sbostic mark '8.12' ; $SED -e 's/[123]/X/g' lines1 46255998Sbostic mark '8.13' ; $SED -e 'y/0123456789/9876543210/' lines1 46355998Sbostic mark '8.14' ; 46455998Sbostic if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then 46555998Sbostic echo BSD/GNU/SUN sed fail this test 46655998Sbostic else 46755998Sbostic $SED -e 'y10\123456789198765432\101' lines1 46855998Sbostic fi 46955998Sbostic mark '8.15' ; $SED -e '1N;2y/\n/X/' lines1 47055998Sbostic} 47155998Sbostic 47256007Sbostictest_error() 47356007Sbostic{ 47456007Sbostic exec 0>&3 4>&1 5>&2 47556007Sbostic exec 0</dev/null 47656007Sbostic exec 2>&1 47756007Sbostic set -x 47856007Sbostic $TEST -x && exit 1 47956007Sbostic $TEST -f && exit 1 48056007Sbostic $TEST -e && exit 1 48156007Sbostic $TEST -f /dev/dds && exit 1 48256007Sbostic $TEST p /dev/dds && exit 1 48356007Sbostic $TEST -f /bin/sh && exit 1 48456007Sbostic $TEST '{' && exit 1 48556007Sbostic $TEST '{' && exit 1 48656007Sbostic $TEST '/hello/' && exit 1 48756007Sbostic $TEST '1,/hello/' && exit 1 48856007Sbostic $TEST -e '-5p' && exit 1 48956007Sbostic $TEST '/jj' && exit 1 49056007Sbostic $TEST 'a hello' && exit 1 49156007Sbostic $TEST 'a \ hello' && exit 1 49256007Sbostic $TEST 'b foo' && exit 1 49356007Sbostic $TEST 'd hello' && exit 1 49456007Sbostic $TEST 's/aa' && exit 1 49556007Sbostic $TEST 's/aa/' && exit 1 49656007Sbostic $TEST 's/a/b' && exit 1 49756007Sbostic $TEST 's/a/b/c/d' && exit 1 49856007Sbostic $TEST 's/a/b/ 1 2' && exit 1 49956007Sbostic $TEST 's/a/b/ 1 g' && exit 1 50056007Sbostic $TEST 's/a/b/w' && exit 1 50156007Sbostic $TEST 'y/aa' && exit 1 50256007Sbostic $TEST 'y/aa/b/' && exit 1 50356007Sbostic $TEST 'y/aa/' && exit 1 50456007Sbostic $TEST 'y/a/b' && exit 1 50556007Sbostic $TEST 'y/a/b/c/d' && exit 1 50656007Sbostic $TEST '!' && exit 1 50756046Sbostic $TEST supercalifrangolisticexprialidociussupercalifrangolisticexcius 50856007Sbostic set +x 50956007Sbostic exec 0>&3 1>&4 2>&5 51056007Sbostic} 51156007Sbostic 51255998Sbosticmain 513