155998Sbostic#!/bin/sh - 255998Sbostic# 355998Sbostic# Copyright (c) 1992 Diomidis Spinellis. 4*62228Sbostic# Copyright (c) 1992, 1993 5*62228Sbostic# The Regents of the University of California. All rights reserved. 655998Sbostic# 755998Sbostic# %sccs.include.redist.sh% 855998Sbostic# 9*62228Sbostic# @(#)sed.test 8.1 (Berkeley) 06/06/93 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{ 2056072Sbostic 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 35559142Storek# Branch across block boundary 35659142Storek mark '5.8' ; $SED -e ' 35759142Storek{ 35859142Storek:b 35955998Sbostic} 36059142Storeks/l/m/ 36159142Storektb' lines1 36259142Storek} 36355998Sbostic 36455998Sbostictest_pattern() 36555998Sbostic{ 36655998Sbosticecho Pattern space commands 36755998Sbostic# Check that the pattern space is deleted 36855998Sbostic mark '6.1' ; $SED -n -e ' 36955998Sbosticc\ 37055998Sbosticchanged 37155998Sbosticp 37255998Sbostic' lines1 37355998Sbostic mark '6.2' ; $SED -n -e ' 37455998Sbostic4d 37555998Sbosticp 37655998Sbostic' lines1 37755998Sbostic# SunOS sed refused to print here 37855998Sbostic# mark '6.3' ; $SED -e ' 37955998Sbostic#N 38055998Sbostic#N 38155998Sbostic#N 38255998Sbostic#D 38355998Sbostic#P 38455998Sbostic#4p 38555998Sbostic#' lines1 38655998Sbostic mark '6.4' ; $SED -e ' 38755998Sbostic2h 38855998Sbostic3H 38955998Sbostic4g 39055998Sbostic5G 39155998Sbostic6x 39255998Sbostic6p 39355998Sbostic6x 39455998Sbostic6p 39555998Sbostic' lines1 39655998Sbostic mark '6.5' ; $SED -e '4n' lines1 39755998Sbostic mark '6.6' ; $SED -n -e '4n' lines1 39855998Sbostic} 39955998Sbostic 40055998Sbostictest_print() 40155998Sbostic{ 40255998Sbostic echo Testing print and file routines 40355998Sbostic awk 'END {for (i = 1; i < 256; i++) printf("%c", i);print "\n"}' \ 40455998Sbostic </dev/null >lines3 40555998Sbostic # GNU and SunOS sed behave differently here 40655998Sbostic mark '7.1' 40755998Sbostic if [ $BSD -eq 1 ] ; then 40855998Sbostic echo 'BSD sed drops core on this one; TEST SKIPPED' 40955998Sbostic else 41055998Sbostic $SED -n l lines3 41155998Sbostic fi 41255998Sbostic mark '7.2' ; $SED -e '/l2_/=' lines1 lines2 41355998Sbostic rm -f lines4 41455998Sbostic mark '7.3' ; $SED -e '3,12w lines4' lines1 41555998Sbostic echo w results 41655998Sbostic cat lines4 41755998Sbostic mark '7.4' ; $SED -e '4r lines2' lines1 41855998Sbostic mark '7.5' ; $SED -e '5r /dev/dds' lines1 41955998Sbostic mark '7.6' ; $SED -e '6r /dev/null' lines1 42055998Sbostic mark '7.7' 42155998Sbostic if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then 42255998Sbostic echo BSD, GNU and SunOS cannot pass this one 42355998Sbostic else 42455998Sbostic sed '200q' $DICT | sed 's$.*$s/^/&/w tmpdir/&$' >script1 42555998Sbostic rm -rf tmpdir 42655998Sbostic mkdir tmpdir 42755998Sbostic $SED -f script1 lines1 42855998Sbostic cat tmpdir/* 42955998Sbostic rm -rf tmpdir 43055998Sbostic fi 43155998Sbostic mark '7.8' 43255998Sbostic if [ $BSD -eq 1 ] ; then 43355998Sbostic echo BSD sed cannot pass 7.7 43455998Sbostic else 43555998Sbostic echo line1 > lines3 43655998Sbostic echo "" >> lines3 43755998Sbostic $SED -n -e '$p' lines3 /dev/null 43855998Sbostic fi 43955998Sbostic 44055998Sbostic} 44155998Sbostic 44255998Sbostictest_subst() 44355998Sbostic{ 44455998Sbostic echo Testing substitution commands 44555998Sbostic mark '8.1' ; $SED -e 's/./X/g' lines1 44655998Sbostic mark '8.2' ; $SED -e 's,.,X,g' lines1 44755998Sbostic# GNU and SunOS sed thinks we are escaping . as wildcard, not as separator 44855998Sbostic# mark '8.3' ; $SED -e 's.\..X.g' lines1 44955998Sbostic# POSIX does not say that this should work 45055998Sbostic# mark '8.4' ; $SED -e 's/[/]/Q/' lines1 45155998Sbostic mark '8.4' ; $SED -e 's/[\/]/Q/' lines1 45255998Sbostic mark '8.5' ; $SED -e 's_\__X_' lines1 45355998Sbostic mark '8.6' ; $SED -e 's/./(&)/g' lines1 45455998Sbostic mark '8.7' ; $SED -e 's/./(\&)/g' lines1 45555998Sbostic mark '8.8' ; $SED -e 's/\(.\)\(.\)\(.\)/x\3x\2x\1/g' lines1 45655998Sbostic mark '8.9' ; $SED -e 's/_/u0\ 45755998Sbosticu1\ 45855998Sbosticu2/g' lines1 45955998Sbostic mark '8.10' 46055998Sbostic if [ $BSD -eq 1 -o $GNU -eq 1 ] ; then 46155998Sbostic echo 'BSD/GNU sed do not understand digit flags on s commands' 46255998Sbostic fi 46355998Sbostic $SED -e 's/./X/4' lines1 46455998Sbostic rm -f lines4 46555998Sbostic mark '8.11' ; $SED -e 's/1/X/w lines4' lines1 46655998Sbostic echo s wfile results 46755998Sbostic cat lines4 46855998Sbostic mark '8.12' ; $SED -e 's/[123]/X/g' lines1 46955998Sbostic mark '8.13' ; $SED -e 'y/0123456789/9876543210/' lines1 47055998Sbostic mark '8.14' ; 47155998Sbostic if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then 47255998Sbostic echo BSD/GNU/SUN sed fail this test 47355998Sbostic else 47455998Sbostic $SED -e 'y10\123456789198765432\101' lines1 47555998Sbostic fi 47655998Sbostic mark '8.15' ; $SED -e '1N;2y/\n/X/' lines1 47756074Sbostic mark '8.16' 47856074Sbostic if [ $BSD -eq 1 ] ; then 47956074Sbostic echo 'BSD sed does not handle branch defined REs' 48056074Sbostic else 48156074Sbostic echo 'eeefff' | $SED -e 'p' -e 's/e/X/p' -e ':x' \ 48256074Sbostic -e 's//Y/p' -e '/f/bx' 48356074Sbostic fi 48455998Sbostic} 48555998Sbostic 48656007Sbostictest_error() 48756007Sbostic{ 48856007Sbostic exec 0>&3 4>&1 5>&2 48956007Sbostic exec 0</dev/null 49056007Sbostic exec 2>&1 49156007Sbostic set -x 49256007Sbostic $TEST -x && exit 1 49356007Sbostic $TEST -f && exit 1 49456007Sbostic $TEST -e && exit 1 49556007Sbostic $TEST -f /dev/dds && exit 1 49656007Sbostic $TEST p /dev/dds && exit 1 49756007Sbostic $TEST -f /bin/sh && exit 1 49856007Sbostic $TEST '{' && exit 1 49956007Sbostic $TEST '{' && exit 1 50056007Sbostic $TEST '/hello/' && exit 1 50156007Sbostic $TEST '1,/hello/' && exit 1 50256007Sbostic $TEST -e '-5p' && exit 1 50356007Sbostic $TEST '/jj' && exit 1 50456007Sbostic $TEST 'a hello' && exit 1 50556007Sbostic $TEST 'a \ hello' && exit 1 50656007Sbostic $TEST 'b foo' && exit 1 50756007Sbostic $TEST 'd hello' && exit 1 50856007Sbostic $TEST 's/aa' && exit 1 50956007Sbostic $TEST 's/aa/' && exit 1 51056007Sbostic $TEST 's/a/b' && exit 1 51156007Sbostic $TEST 's/a/b/c/d' && exit 1 51256007Sbostic $TEST 's/a/b/ 1 2' && exit 1 51356007Sbostic $TEST 's/a/b/ 1 g' && exit 1 51456007Sbostic $TEST 's/a/b/w' && exit 1 51556007Sbostic $TEST 'y/aa' && exit 1 51656007Sbostic $TEST 'y/aa/b/' && exit 1 51756007Sbostic $TEST 'y/aa/' && exit 1 51856007Sbostic $TEST 'y/a/b' && exit 1 51956007Sbostic $TEST 'y/a/b/c/d' && exit 1 52056007Sbostic $TEST '!' && exit 1 52156046Sbostic $TEST supercalifrangolisticexprialidociussupercalifrangolisticexcius 52256007Sbostic set +x 52356007Sbostic exec 0>&3 1>&4 2>&5 52456007Sbostic} 52556007Sbostic 52655998Sbosticmain 527