1cd94aa94SAndy Fiddaman#!/bin/ksh -p 2cd94aa94SAndy Fiddaman# 3cd94aa94SAndy Fiddaman# Copyright (c) 1992 Diomidis Spinellis. 4cd94aa94SAndy Fiddaman# Copyright (c) 1992, 1993 5cd94aa94SAndy Fiddaman# The Regents of the University of California. All rights reserved. 6cd94aa94SAndy Fiddaman# 7cd94aa94SAndy Fiddaman# Redistribution and use in source and binary forms, with or without 8cd94aa94SAndy Fiddaman# modification, are permitted provided that the following conditions 9cd94aa94SAndy Fiddaman# are met: 10cd94aa94SAndy Fiddaman# 1. Redistributions of source code must retain the above copyright 11cd94aa94SAndy Fiddaman# notice, this list of conditions and the following disclaimer. 12cd94aa94SAndy Fiddaman# 2. Redistributions in binary form must reproduce the above copyright 13cd94aa94SAndy Fiddaman# notice, this list of conditions and the following disclaimer in the 14cd94aa94SAndy Fiddaman# documentation and/or other materials provided with the distribution. 15cd94aa94SAndy Fiddaman# 3. Neither the name of the University nor the names of its contributors 16cd94aa94SAndy Fiddaman# may be used to endorse or promote products derived from this software 17cd94aa94SAndy Fiddaman# without specific prior written permission. 18cd94aa94SAndy Fiddaman# 19cd94aa94SAndy Fiddaman# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20cd94aa94SAndy Fiddaman# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21cd94aa94SAndy Fiddaman# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22cd94aa94SAndy Fiddaman# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23cd94aa94SAndy Fiddaman# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24cd94aa94SAndy Fiddaman# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25cd94aa94SAndy Fiddaman# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26cd94aa94SAndy Fiddaman# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27cd94aa94SAndy Fiddaman# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28cd94aa94SAndy Fiddaman# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29cd94aa94SAndy Fiddaman# SUCH DAMAGE. 30cd94aa94SAndy Fiddaman# 31cd94aa94SAndy Fiddaman# @(#)sed.test 8.1 (Berkeley) 6/6/93 32cd94aa94SAndy Fiddaman# 33cd94aa94SAndy Fiddaman# $FreeBSD$ 34cd94aa94SAndy Fiddaman# 35cd94aa94SAndy Fiddaman 36cd94aa94SAndy Fiddaman# sed Regression Tests 37cd94aa94SAndy Fiddaman# 38cd94aa94SAndy Fiddaman# The directory regress.test.out contains the expected test results 39cd94aa94SAndy Fiddaman# 40cd94aa94SAndy Fiddaman# These are the regression tests mostly created during the development 41cd94aa94SAndy Fiddaman# of the BSD sed. Each test should have a unique mark name, which is 42cd94aa94SAndy Fiddaman# used for naming the corresponding file in regress.multitest.out. 43cd94aa94SAndy Fiddaman 44cd94aa94SAndy FiddamanSRCDIR=$(dirname $0) 45cd94aa94SAndy Fiddaman 46cd94aa94SAndy FiddamanSED=${SED:=/usr/bin/sed} 47cd94aa94SAndy Fiddaman 48*b15548abSRobert Mustacchi# 49*b15548abSRobert Mustacchi# Sanitize the environment so we're able to operate with known good 50*b15548abSRobert Mustacchi# defaults. Note, tests such as 7.1 require that we're in the C locale. 51*b15548abSRobert Mustacchi# 52*b15548abSRobert Mustacchiunalias -a 53*b15548abSRobert Mustacchiexport LANG=C 54*b15548abSRobert Mustacchi 55cd94aa94SAndy Fiddamantypeset -i err=0 56cd94aa94SAndy Fiddamantypeset -i pass=0 57cd94aa94SAndy Fiddamantypeset -i fail=0 58cd94aa94SAndy Fiddaman 59cd94aa94SAndy Fiddamanfatal() { 60cd94aa94SAndy Fiddaman echo "[FATAL] $*" > /dev/stderr 61cd94aa94SAndy Fiddaman exit 1 62cd94aa94SAndy Fiddaman} 63cd94aa94SAndy Fiddaman 64cd94aa94SAndy Fiddamanmain() 65cd94aa94SAndy Fiddaman{ 66cd94aa94SAndy Fiddaman REGRESS=${SRCDIR}/regress.multitest.out 67cd94aa94SAndy Fiddaman [[ -d $REGRESS ]] || fatal "Could not locate regress directory" 68cd94aa94SAndy Fiddaman 69cd94aa94SAndy Fiddaman DICT=/usr/share/lib/dict/words 70cd94aa94SAndy Fiddaman [[ -r $DICT ]] || fatal "Coult not read dictionary $DICT" 71cd94aa94SAndy Fiddaman 72cd94aa94SAndy Fiddaman OPDIR=$(mktemp -d) 73cd94aa94SAndy Fiddaman [[ -n "$OPDIR" && -d "$OPDIR" ]] || \ 74cd94aa94SAndy Fiddaman fatal "Could not create output directory" 75cd94aa94SAndy Fiddaman 76cd94aa94SAndy Fiddaman awk 'END { for (i = 1; i < 15; i++) print "l1_" i}' \ 77cd94aa94SAndy Fiddaman </dev/null >$OPDIR/lines1 78cd94aa94SAndy Fiddaman awk 'END { for (i = 1; i < 10; i++) print "l2_" i}' \ 79cd94aa94SAndy Fiddaman </dev/null >$OPDIR/lines2 80cd94aa94SAndy Fiddaman [[ -s $OPDIR/lines1 && -s $OPDIR/lines2 ]] || \ 81cd94aa94SAndy Fiddaman fatal "Could not seed lines files" 82cd94aa94SAndy Fiddaman 83cd94aa94SAndy Fiddaman lines1=$OPDIR/lines1 84cd94aa94SAndy Fiddaman lines2=$OPDIR/lines2 85cd94aa94SAndy Fiddaman lines3=$OPDIR/lines3 86cd94aa94SAndy Fiddaman lines4=$OPDIR/lines4 87cd94aa94SAndy Fiddaman script1=$OPDIR/script1 88cd94aa94SAndy Fiddaman script2=$OPDIR/script2 89cd94aa94SAndy Fiddaman 90cd94aa94SAndy Fiddaman exec 4>&1 5>&2 91cd94aa94SAndy Fiddaman tests 92cd94aa94SAndy Fiddaman exec 1>&4 2>&5 93cd94aa94SAndy Fiddaman 94cd94aa94SAndy Fiddaman # Remove temporary files 95cd94aa94SAndy Fiddaman rm -rf $OPDIR/ 96cd94aa94SAndy Fiddaman} 97cd94aa94SAndy Fiddaman 98cd94aa94SAndy Fiddamantests() 99cd94aa94SAndy Fiddaman{ 100cd94aa94SAndy Fiddaman MARK=0 101cd94aa94SAndy Fiddaman 102cd94aa94SAndy Fiddaman test_args 103cd94aa94SAndy Fiddaman test_addr 104cd94aa94SAndy Fiddaman test_group 105cd94aa94SAndy Fiddaman test_acid 106cd94aa94SAndy Fiddaman test_branch 107cd94aa94SAndy Fiddaman test_pattern 108cd94aa94SAndy Fiddaman test_print 109cd94aa94SAndy Fiddaman test_subst 110cd94aa94SAndy Fiddaman test_error 111cd94aa94SAndy Fiddaman # Handle the result of the last test 112cd94aa94SAndy Fiddaman result 113cd94aa94SAndy Fiddaman} 114cd94aa94SAndy Fiddaman 115cd94aa94SAndy Fiddaman# Display a test's result 116cd94aa94SAndy Fiddamanresult() 117cd94aa94SAndy Fiddaman{ 118cd94aa94SAndy Fiddaman if [ "$TODO" = '1' ] ; then 119cd94aa94SAndy Fiddaman TODO='TODO ' 120cd94aa94SAndy Fiddaman else 121cd94aa94SAndy Fiddaman TODO='' 122cd94aa94SAndy Fiddaman fi 123cd94aa94SAndy Fiddaman if ! [ -r $REGRESS/${TESTNAME} ] ; then 124cd94aa94SAndy Fiddaman echo "Seeding $REGRESS/${TESTNAME} with current result" 1>&2 125cd94aa94SAndy Fiddaman cp $OPDIR/current.out $REGRESS/${TESTNAME} 126cd94aa94SAndy Fiddaman fi 127cd94aa94SAndy Fiddaman if cmp -s $REGRESS/${TESTNAME} $OPDIR/current.out ; then 128cd94aa94SAndy Fiddaman echo "[PASS] $MARK $TESTNAME # $TODO$OCOMMENT" 129cd94aa94SAndy Fiddaman ((pass++)) 130cd94aa94SAndy Fiddaman else 131cd94aa94SAndy Fiddaman echo "[FAIL] $MARK $TESTNAME # $TODO$OCOMMENT" 132cd94aa94SAndy Fiddaman if [[ -z "$TODO" ]]; then 133cd94aa94SAndy Fiddaman diff -u $REGRESS/${TESTNAME} $OPDIR/current.out 134cd94aa94SAndy Fiddaman ((fail++)) 135cd94aa94SAndy Fiddaman err=1 136cd94aa94SAndy Fiddaman fi 137cd94aa94SAndy Fiddaman fi 1>&4 2>&5 138cd94aa94SAndy Fiddaman} 139cd94aa94SAndy Fiddaman 140cd94aa94SAndy Fiddaman# Mark the beginning of each test 141cd94aa94SAndy Fiddamanmark() 142cd94aa94SAndy Fiddaman{ 143cd94aa94SAndy Fiddaman [ $MARK -gt 0 ] && result 144cd94aa94SAndy Fiddaman OCOMMENT=$COMMENT 145cd94aa94SAndy Fiddaman MARK=`expr $MARK + 1` 146cd94aa94SAndy Fiddaman TESTNAME=$1 147cd94aa94SAndy Fiddaman exec 1>&4 2>&5 148cd94aa94SAndy Fiddaman exec >"$OPDIR/current.out" 149cd94aa94SAndy Fiddaman} 150cd94aa94SAndy Fiddaman 151cd94aa94SAndy Fiddamantest_args() 152cd94aa94SAndy Fiddaman{ 153cd94aa94SAndy Fiddaman COMMENT='Argument parsing - first type' 154cd94aa94SAndy Fiddaman mark '1.1' 155cd94aa94SAndy Fiddaman $SED 's/^/e1_/p' $lines1 156cd94aa94SAndy Fiddaman mark '1.2' ; $SED -n 's/^/e1_/p' $lines1 157cd94aa94SAndy Fiddaman mark '1.3' 158cd94aa94SAndy Fiddaman $SED 's/^/e1_/p' <$lines1 159cd94aa94SAndy Fiddaman mark '1.4' ; $SED -n 's/^/e1_/p' <$lines1 160cd94aa94SAndy Fiddaman COMMENT='Argument parsing - second type' 161cd94aa94SAndy Fiddaman mark '1.4.1' 162cd94aa94SAndy Fiddaman $SED -e '' <$lines1 163cd94aa94SAndy Fiddaman echo 's/^/s1_/p' >$script1 164cd94aa94SAndy Fiddaman echo 's/^/s2_/p' >$script2 165cd94aa94SAndy Fiddaman mark '1.5' 166cd94aa94SAndy Fiddaman $SED -f $script1 $lines1 167cd94aa94SAndy Fiddaman mark '1.6' 168cd94aa94SAndy Fiddaman $SED -f $script1 <$lines1 169cd94aa94SAndy Fiddaman mark '1.7' 170cd94aa94SAndy Fiddaman $SED -e 's/^/e1_/p' $lines1 171cd94aa94SAndy Fiddaman mark '1.8' 172cd94aa94SAndy Fiddaman $SED -e 's/^/e1_/p' <$lines1 173cd94aa94SAndy Fiddaman mark '1.9' ; $SED -n -f $script1 $lines1 174cd94aa94SAndy Fiddaman mark '1.10' ; $SED -n -f $script1 <$lines1 175cd94aa94SAndy Fiddaman mark '1.11' ; $SED -n -e 's/^/e1_/p' $lines1 176cd94aa94SAndy Fiddaman mark '1.12' 177cd94aa94SAndy Fiddaman $SED -n -e 's/^/e1_/p' <$lines1 178cd94aa94SAndy Fiddaman mark '1.13' 179cd94aa94SAndy Fiddaman $SED -e 's/^/e1_/p' -e 's/^/e2_/p' $lines1 180cd94aa94SAndy Fiddaman mark '1.14' 181cd94aa94SAndy Fiddaman $SED -f $script1 -f $script2 $lines1 182cd94aa94SAndy Fiddaman mark '1.15' 183cd94aa94SAndy Fiddaman $SED -e 's/^/e1_/p' -f $script1 $lines1 184cd94aa94SAndy Fiddaman mark '1.16' 185cd94aa94SAndy Fiddaman $SED -e 's/^/e1_/p' $lines1 $lines1 186cd94aa94SAndy Fiddaman # POSIX D11.2:11251 187cd94aa94SAndy Fiddaman mark '1.17' ; $SED p <$lines1 $lines1 188cd94aa94SAndy Fiddamancat >$script1 <<EOF 189cd94aa94SAndy Fiddaman#n 190cd94aa94SAndy Fiddaman# A comment 191cd94aa94SAndy Fiddaman 192cd94aa94SAndy Fiddamanp 193cd94aa94SAndy FiddamanEOF 194cd94aa94SAndy Fiddaman mark '1.18' ; $SED -f $script1 <$lines1 $lines1 195cd94aa94SAndy Fiddaman} 196cd94aa94SAndy Fiddaman 197cd94aa94SAndy Fiddamantest_addr() 198cd94aa94SAndy Fiddaman{ 199cd94aa94SAndy Fiddaman COMMENT='Address ranges' 200cd94aa94SAndy Fiddaman mark '2.1' ; $SED -n -e '4p' $lines1 201cd94aa94SAndy Fiddaman mark '2.2' ; $SED -n -e '20p' $lines1 $lines2 202cd94aa94SAndy Fiddaman mark '2.3' ; $SED -n -e '$p' $lines1 203cd94aa94SAndy Fiddaman mark '2.4' ; $SED -n -e '$p' $lines1 $lines2 204cd94aa94SAndy Fiddaman mark '2.5' ; $SED -n -e '$a\ 205cd94aa94SAndy Fiddamanhello' /dev/null 206cd94aa94SAndy Fiddaman mark '2.6' ; $SED -n -e '$p' $lines1 /dev/null $lines2 207cd94aa94SAndy Fiddaman # Should not print anything 208cd94aa94SAndy Fiddaman mark '2.7' ; $SED -n -e '20p' $lines1 209cd94aa94SAndy Fiddaman mark '2.8' ; $SED -n -e '/NOTFOUND/p' $lines1 210cd94aa94SAndy Fiddaman mark '2.9' ; $SED -n '/l1_7/p' $lines1 211cd94aa94SAndy Fiddaman mark '2.10' ; $SED -n ' /l1_7/ p' $lines1 212cd94aa94SAndy Fiddaman mark '2.11' ; $SED -n '\_l1\_7_p' $lines1 213cd94aa94SAndy Fiddaman mark '2.12' ; $SED -n '1,4p' $lines1 214cd94aa94SAndy Fiddaman mark '2.13' ; $SED -n '1,$p' $lines1 $lines2 215cd94aa94SAndy Fiddaman mark '2.14' ; $SED -n '1,/l2_9/p' $lines1 $lines2 216cd94aa94SAndy Fiddaman mark '2.15' ; $SED -n '/4/,$p' $lines1 $lines2 217cd94aa94SAndy Fiddaman mark '2.16' ; $SED -n '/4/,20p' $lines1 $lines2 218cd94aa94SAndy Fiddaman mark '2.17' ; $SED -n '/4/,/10/p' $lines1 $lines2 219cd94aa94SAndy Fiddaman mark '2.18' ; $SED -n '/l2_3/,/l1_8/p' $lines1 $lines2 220cd94aa94SAndy Fiddaman mark '2.19' ; $SED -n '12,3p' $lines1 $lines2 221cd94aa94SAndy Fiddaman mark '2.20' ; $SED -n '/l1_7/,3p' $lines1 $lines2 222cd94aa94SAndy Fiddaman mark '2.21' ; $SED -n '13,+4p' $lines1 $lines2 223cd94aa94SAndy Fiddaman mark '2.22' ; $SED -n '/l1_6/,+2p' $lines1 $lines2 224cd94aa94SAndy Fiddaman # For PR bin/192108 225cd94aa94SAndy Fiddaman mark '2.23'; $SED -n '12,+1p' $lines1 226cd94aa94SAndy Fiddaman} 227cd94aa94SAndy Fiddaman 228cd94aa94SAndy Fiddamantest_group() 229cd94aa94SAndy Fiddaman{ 230cd94aa94SAndy Fiddaman COMMENT='Brace and other grouping' 231cd94aa94SAndy Fiddaman mark '3.1' ; $SED -e ' 232cd94aa94SAndy Fiddaman4,12 { 233cd94aa94SAndy Fiddaman s/^/^/ 234cd94aa94SAndy Fiddaman s/$/$/ 235cd94aa94SAndy Fiddaman s/_/T/ 236cd94aa94SAndy Fiddaman}' $lines1 237cd94aa94SAndy Fiddaman mark '3.2' ; $SED -e ' 238cd94aa94SAndy Fiddaman4,12 { 239cd94aa94SAndy Fiddaman s/^/^/ 240cd94aa94SAndy Fiddaman /6/,/10/ { 241cd94aa94SAndy Fiddaman s/$/$/ 242cd94aa94SAndy Fiddaman /8/ s/_/T/ 243cd94aa94SAndy Fiddaman } 244cd94aa94SAndy Fiddaman}' $lines1 245cd94aa94SAndy Fiddaman mark '3.3' ; $SED -e ' 246cd94aa94SAndy Fiddaman4,12 !{ 247cd94aa94SAndy Fiddaman s/^/^/ 248cd94aa94SAndy Fiddaman /6/,/10/ !{ 249cd94aa94SAndy Fiddaman s/$/$/ 250cd94aa94SAndy Fiddaman /8/ !s/_/T/ 251cd94aa94SAndy Fiddaman } 252cd94aa94SAndy Fiddaman}' $lines1 253cd94aa94SAndy Fiddaman mark '3.4' ; $SED -e '4,12!s/^/^/' $lines1 254cd94aa94SAndy Fiddaman} 255cd94aa94SAndy Fiddaman 256cd94aa94SAndy Fiddamantest_acid() 257cd94aa94SAndy Fiddaman{ 258cd94aa94SAndy Fiddaman COMMENT='Commands a c d and i' 259cd94aa94SAndy Fiddaman mark '4.1' ; $SED -n -e ' 260cd94aa94SAndy Fiddamans/^/before_i/p 261cd94aa94SAndy Fiddaman20i\ 262cd94aa94SAndy Fiddamaninserted 263cd94aa94SAndy Fiddamans/^/after_i/p 264cd94aa94SAndy Fiddaman' $lines1 $lines2 265cd94aa94SAndy Fiddaman mark '4.2' ; $SED -n -e ' 266cd94aa94SAndy Fiddaman5,12s/^/5-12/ 267cd94aa94SAndy Fiddamans/^/before_a/p 268cd94aa94SAndy Fiddaman/5-12/a\ 269cd94aa94SAndy Fiddamanappended 270cd94aa94SAndy Fiddamans/^/after_a/p 271cd94aa94SAndy Fiddaman' $lines1 $lines2 272cd94aa94SAndy Fiddaman mark '4.3' 273cd94aa94SAndy Fiddaman $SED -n -e ' 274cd94aa94SAndy Fiddamans/^/^/p 275cd94aa94SAndy Fiddaman/l1_/a\ 276cd94aa94SAndy Fiddamanappended 277cd94aa94SAndy Fiddaman8,10N 278cd94aa94SAndy Fiddamans/$/$/p 279cd94aa94SAndy Fiddaman' $lines1 $lines2 280cd94aa94SAndy Fiddaman mark '4.4' ; $SED -n -e ' 281cd94aa94SAndy Fiddamanc\ 282cd94aa94SAndy Fiddamanhello 283cd94aa94SAndy Fiddaman' $lines1 284cd94aa94SAndy Fiddaman mark '4.5' ; $SED -n -e ' 285cd94aa94SAndy Fiddaman8c\ 286cd94aa94SAndy Fiddamanhello 287cd94aa94SAndy Fiddaman' $lines1 288cd94aa94SAndy Fiddaman mark '4.6' ; $SED -n -e ' 289cd94aa94SAndy Fiddaman3,14c\ 290cd94aa94SAndy Fiddamanhello 291cd94aa94SAndy Fiddaman' $lines1 292cd94aa94SAndy Fiddaman# SunOS and GNU sed behave differently. We follow POSIX 293cd94aa94SAndy Fiddaman mark '4.7' ; $SED -n -e ' 294cd94aa94SAndy Fiddaman8,3c\ 295cd94aa94SAndy Fiddamanhello 296cd94aa94SAndy Fiddaman' $lines1 297cd94aa94SAndy Fiddaman mark '4.8' ; $SED d <$lines1 298cd94aa94SAndy Fiddaman} 299cd94aa94SAndy Fiddaman 300cd94aa94SAndy Fiddamantest_branch() 301cd94aa94SAndy Fiddaman{ 302cd94aa94SAndy Fiddaman COMMENT='Labels and branching' 303cd94aa94SAndy Fiddaman mark '5.1' ; $SED -n -e ' 304cd94aa94SAndy Fiddamanb label4 305cd94aa94SAndy Fiddaman:label3 306cd94aa94SAndy Fiddamans/^/label3_/p 307cd94aa94SAndy Fiddamanb end 308cd94aa94SAndy Fiddaman:label4 309cd94aa94SAndy Fiddaman2,12b label1 310cd94aa94SAndy Fiddamanb label2 311cd94aa94SAndy Fiddaman:label1 312cd94aa94SAndy Fiddamans/^/label1_/p 313cd94aa94SAndy Fiddamanb 314cd94aa94SAndy Fiddaman:label2 315cd94aa94SAndy Fiddamans/^/label2_/p 316cd94aa94SAndy Fiddamanb label3 317cd94aa94SAndy Fiddaman:end 318cd94aa94SAndy Fiddaman' $lines1 319cd94aa94SAndy Fiddaman mark '5.2' 320cd94aa94SAndy Fiddaman $SED -n -e ' 321cd94aa94SAndy Fiddamans/l1_/l2_/ 322cd94aa94SAndy Fiddamant ok 323cd94aa94SAndy Fiddamanb 324cd94aa94SAndy Fiddaman:ok 325cd94aa94SAndy Fiddamans/^/tested /p 326cd94aa94SAndy Fiddaman' $lines1 $lines2 327cd94aa94SAndy Fiddaman# SunOS and GNU sed behave as follows: lines 9-$ aren't printed at all 328cd94aa94SAndy Fiddaman mark '5.3' ; $SED -n -e ' 329cd94aa94SAndy Fiddaman5,8b inside 330cd94aa94SAndy Fiddaman1,5 { 331cd94aa94SAndy Fiddaman s/^/^/p 332cd94aa94SAndy Fiddaman :inside 333cd94aa94SAndy Fiddaman s/$/$/p 334cd94aa94SAndy Fiddaman} 335cd94aa94SAndy Fiddaman' $lines1 336cd94aa94SAndy Fiddaman# Check that t clears the substitution done flag 337cd94aa94SAndy Fiddaman mark '5.4' ; $SED -n -e ' 338cd94aa94SAndy Fiddaman1,8s/^/^/ 339cd94aa94SAndy Fiddamant l1 340cd94aa94SAndy Fiddaman:l1 341cd94aa94SAndy Fiddamant l2 342cd94aa94SAndy Fiddamans/$/$/p 343cd94aa94SAndy Fiddamanb 344cd94aa94SAndy Fiddaman:l2 345cd94aa94SAndy Fiddamans/^/ERROR/ 346cd94aa94SAndy Fiddaman' $lines1 347cd94aa94SAndy Fiddaman# Check that reading a line clears the substitution done flag 348cd94aa94SAndy Fiddaman mark '5.5' 349cd94aa94SAndy Fiddaman $SED -n -e ' 350cd94aa94SAndy Fiddamant l2 351cd94aa94SAndy Fiddaman1,8s/^/^/p 352cd94aa94SAndy Fiddaman2,7N 353cd94aa94SAndy Fiddamanb 354cd94aa94SAndy Fiddaman:l2 355cd94aa94SAndy Fiddamans/^/ERROR/p 356cd94aa94SAndy Fiddaman' $lines1 357cd94aa94SAndy Fiddaman mark '5.6' ; $SED 5q $lines1 358cd94aa94SAndy Fiddaman mark '5.7' ; $SED -e ' 359cd94aa94SAndy Fiddaman5i\ 360cd94aa94SAndy Fiddamanhello 361cd94aa94SAndy Fiddaman5q' $lines1 362cd94aa94SAndy Fiddaman# Branch across block boundary 363cd94aa94SAndy Fiddaman mark '5.8' ; $SED -e ' 364cd94aa94SAndy Fiddaman{ 365cd94aa94SAndy Fiddaman:b 366cd94aa94SAndy Fiddaman} 367cd94aa94SAndy Fiddamans/l/m/ 368cd94aa94SAndy Fiddamantb' $lines1 369cd94aa94SAndy Fiddaman} 370cd94aa94SAndy Fiddaman 371cd94aa94SAndy Fiddamantest_pattern() 372cd94aa94SAndy Fiddaman{ 373cd94aa94SAndy FiddamanCOMMENT='Pattern space commands' 374cd94aa94SAndy Fiddaman# Check that the pattern space is deleted 375cd94aa94SAndy Fiddaman mark '6.1' ; $SED -n -e ' 376cd94aa94SAndy Fiddamanc\ 377cd94aa94SAndy Fiddamanchanged 378cd94aa94SAndy Fiddamanp 379cd94aa94SAndy Fiddaman' $lines1 380cd94aa94SAndy Fiddaman mark '6.2' ; $SED -n -e ' 381cd94aa94SAndy Fiddaman4d 382cd94aa94SAndy Fiddamanp 383cd94aa94SAndy Fiddaman' $lines1 384cd94aa94SAndy Fiddaman mark '6.3' 385cd94aa94SAndy Fiddaman $SED -e 'N;N;N;D' $lines1 386cd94aa94SAndy Fiddaman mark '6.4' ; $SED -e ' 387cd94aa94SAndy Fiddaman2h 388cd94aa94SAndy Fiddaman3H 389cd94aa94SAndy Fiddaman4g 390cd94aa94SAndy Fiddaman5G 391cd94aa94SAndy Fiddaman6x 392cd94aa94SAndy Fiddaman6p 393cd94aa94SAndy Fiddaman6x 394cd94aa94SAndy Fiddaman6p 395cd94aa94SAndy Fiddaman' $lines1 396cd94aa94SAndy Fiddaman mark '6.5' ; $SED -e '4n' $lines1 397cd94aa94SAndy Fiddaman mark '6.6' ; $SED -n -e '4n' $lines1 398cd94aa94SAndy Fiddaman} 399cd94aa94SAndy Fiddaman 400cd94aa94SAndy Fiddamantest_print() 401cd94aa94SAndy Fiddaman{ 402cd94aa94SAndy Fiddaman COMMENT='Print and file routines' 403cd94aa94SAndy Fiddaman awk 'END {for (i = 1; i < 256; i++) printf("%c", i);print "\n"}' \ 404cd94aa94SAndy Fiddaman </dev/null >$lines3 405cd94aa94SAndy Fiddaman # GNU and SunOS sed behave differently here 406cd94aa94SAndy Fiddaman mark '7.1' 407cd94aa94SAndy Fiddaman $SED -n l $lines3 408cd94aa94SAndy Fiddaman mark '7.2' ; $SED -e '/l2_/=' $lines1 $lines2 409cd94aa94SAndy Fiddaman rm -f $lines4 410cd94aa94SAndy Fiddaman mark '7.3' ; $SED -e "3,12w $lines4" $lines1 411cd94aa94SAndy Fiddaman COMMENT='w results' 412cd94aa94SAndy Fiddaman cat $lines4 413cd94aa94SAndy Fiddaman mark '7.4' ; $SED -e "4r $lines2" $lines1 414cd94aa94SAndy Fiddaman mark '7.5' ; $SED -e '5r /dev/dds' $lines1 415cd94aa94SAndy Fiddaman mark '7.6' ; $SED -e '6r /dev/null' $lines1 416cd94aa94SAndy Fiddaman mark '7.7' 417cd94aa94SAndy Fiddaman $SED '200q' $DICT | $SED 's$.*$s/^/&/w tmpdir/&$' >$script1 418cd94aa94SAndy Fiddaman rm -rf tmpdir 419cd94aa94SAndy Fiddaman mkdir tmpdir 420cd94aa94SAndy Fiddaman $SED -f $script1 $lines1 421cd94aa94SAndy Fiddaman cat tmpdir/* 422cd94aa94SAndy Fiddaman rm -rf tmpdir 423cd94aa94SAndy Fiddaman mark '7.8' 424cd94aa94SAndy Fiddaman echo line1 > $lines3 425cd94aa94SAndy Fiddaman echo "" >> $lines3 426cd94aa94SAndy Fiddaman $SED -n -e '$p' $lines3 /dev/null 427cd94aa94SAndy Fiddaman 428cd94aa94SAndy Fiddaman} 429cd94aa94SAndy Fiddaman 430cd94aa94SAndy Fiddamantest_subst() 431cd94aa94SAndy Fiddaman{ 432cd94aa94SAndy Fiddaman COMMENT='Substitution commands' 433cd94aa94SAndy Fiddaman mark '8.1' ; $SED -e 's/./X/g' $lines1 434cd94aa94SAndy Fiddaman mark '8.2' ; $SED -e 's,.,X,g' $lines1 435cd94aa94SAndy Fiddaman# SunOS sed thinks we are escaping . as wildcard, not as separator 436cd94aa94SAndy Fiddaman mark '8.3' 437cd94aa94SAndy Fiddaman $SED -e 's.\..X.g' $lines1 438cd94aa94SAndy Fiddaman mark '8.4' ; $SED -e 's/[\/]/Q/' $lines1 439cd94aa94SAndy Fiddaman mark '8.5' ; $SED -e 's_\__X_' $lines1 440cd94aa94SAndy Fiddaman mark '8.6' ; $SED -e 's/./(&)/g' $lines1 441cd94aa94SAndy Fiddaman mark '8.7' ; $SED -e 's/./(\&)/g' $lines1 442cd94aa94SAndy Fiddaman mark '8.8' ; $SED -e 's/\(.\)\(.\)\(.\)/x\3x\2x\1/g' $lines1 443cd94aa94SAndy Fiddaman mark '8.9' ; $SED -e 's/_/u0\ 444cd94aa94SAndy Fiddamanu1\ 445cd94aa94SAndy Fiddamanu2/g' $lines1 446cd94aa94SAndy Fiddaman mark '8.10' 447cd94aa94SAndy Fiddaman $SED -e 's/./X/4' $lines1 448cd94aa94SAndy Fiddaman rm -f $lines4 449cd94aa94SAndy Fiddaman mark '8.11' ; $SED -e "s/1/X/w $lines4" $lines1 450cd94aa94SAndy Fiddaman COMMENT='s wfile results' 451cd94aa94SAndy Fiddaman cat $lines4 452cd94aa94SAndy Fiddaman mark '8.12' ; $SED -e 's/[123]/X/g' $lines1 453cd94aa94SAndy Fiddaman mark '8.13' ; $SED -e 'y/0123456789/9876543210/' $lines1 454cd94aa94SAndy Fiddaman mark '8.14' ; 455cd94aa94SAndy Fiddaman $SED -e 'y10\123456789198765432\101' $lines1 456cd94aa94SAndy Fiddaman mark '8.15' ; $SED -e '1N;2y/\n/X/' $lines1 457cd94aa94SAndy Fiddaman mark '8.16' 458cd94aa94SAndy Fiddaman echo 'eeefff' | $SED -e ' 459cd94aa94SAndy Fiddaman p 460cd94aa94SAndy Fiddaman s/e/X/p 461cd94aa94SAndy Fiddaman :x 462cd94aa94SAndy Fiddaman s//Y/p 463cd94aa94SAndy Fiddaman # Establish limit counter in the hold space 464cd94aa94SAndy Fiddaman # GNU sed version 3.02 enters into an infinite loop here 465cd94aa94SAndy Fiddaman x 466cd94aa94SAndy Fiddaman /.\{10\}/ { 467cd94aa94SAndy Fiddaman s/.*/ERROR/ 468cd94aa94SAndy Fiddaman b 469cd94aa94SAndy Fiddaman } 470cd94aa94SAndy Fiddaman s/.*/&./ 471cd94aa94SAndy Fiddaman x 472cd94aa94SAndy Fiddaman /f/bx 473cd94aa94SAndy Fiddaman ' 474cd94aa94SAndy Fiddaman # POSIX does not say that this should work, 475cd94aa94SAndy Fiddaman # but it does for GNU, BSD, and SunOS 476cd94aa94SAndy Fiddaman mark '8.17' ; $SED -e 's/[/]/Q/' $lines1 477cd94aa94SAndy Fiddaman 478cd94aa94SAndy Fiddaman COMMENT='[ as an s delimiter and its escapes' 479cd94aa94SAndy Fiddaman mark '8.18' ; $SED -e 's[_[X[' $lines1 480cd94aa94SAndy Fiddaman # This is a matter of interpretation 481cd94aa94SAndy Fiddaman # POSIX 1003.1, 2004 says "Within the BRE and the replacement, 482cd94aa94SAndy Fiddaman # the BRE delimiter itself can be used as a *literal* character 483cd94aa94SAndy Fiddaman # if it is preceded by a backslash" 484cd94aa94SAndy Fiddaman # SunOS 5.1 /usr/bin/sed and Mac OS X follow the literal POSIX 485cd94aa94SAndy Fiddaman # interpretation. 486cd94aa94SAndy Fiddaman # GNU sed version 4.1.5 treats \[ as the beginning of a character 487cd94aa94SAndy Fiddaman # set specification (both with --posix and without). 488cd94aa94SAndy Fiddaman mark '8.19' ; $SED 's/l/[/' $lines1 | $SED -e 's[\[.[X[' 489cd94aa94SAndy Fiddaman mark '8.20' ; $SED 's/l/[/' $lines1 | $SED -e 's[\[.[X\[[' 490cd94aa94SAndy Fiddaman COMMENT='\\ in y command' 491cd94aa94SAndy Fiddaman mark '8.21' 492cd94aa94SAndy Fiddaman echo 'a\\b(c' | \ 493cd94aa94SAndy Fiddaman $SED 'y%ABCDEFGHIJKLMNOPQRSTUVWXYZ, /\\()"%abcdefghijklmnopqrstuvwxyz,------%' 494cd94aa94SAndy Fiddaman COMMENT='\\n in a character class' 495cd94aa94SAndy Fiddaman mark '8.22' ; (echo 1; echo 2) | $SED -n '1{;N;s/[\n]/X/;p;}' 496cd94aa94SAndy Fiddaman COMMENT='\\n in a BRE' 497cd94aa94SAndy Fiddaman mark '8.23' ; (echo 1; echo 2) | $SED -n '1{;N;s/\n/X/;p;}' 498cd94aa94SAndy Fiddaman} 499cd94aa94SAndy Fiddaman 500cd94aa94SAndy Fiddamantest_error() 501cd94aa94SAndy Fiddaman{ 502cd94aa94SAndy Fiddaman COMMENT='Error cases' 503cd94aa94SAndy Fiddaman mark '9.1' ; $SED -x 2>/dev/null ; echo $? 504cd94aa94SAndy Fiddaman mark '9.2' ; $SED -f 2>/dev/null ; echo $? 505cd94aa94SAndy Fiddaman mark '9.3' ; $SED -e 2>/dev/null ; echo $? 506cd94aa94SAndy Fiddaman mark '9.4' ; $SED -f /dev/xyzzyxyzy 2>/dev/null ; echo $? 507cd94aa94SAndy Fiddaman mark '9.5' ; $SED p /dev/xyzzyxyzy 2>/dev/null ; echo $? 508cd94aa94SAndy Fiddaman mark '9.6' ; $SED -f /bin/sh 2>/dev/null ; echo $? 509cd94aa94SAndy Fiddaman mark '9.7' ; $SED '{' 2>/dev/null ; echo $? 510cd94aa94SAndy Fiddaman mark '9.8' ; $SED '{' 2>/dev/null ; echo $? 511cd94aa94SAndy Fiddaman mark '9.9' ; $SED '/hello/' 2>/dev/null ; echo $? 512cd94aa94SAndy Fiddaman mark '9.10' ; $SED '1,/hello/' 2>/dev/null ; echo $? 513cd94aa94SAndy Fiddaman mark '9.11' ; $SED -e '-5p' 2>/dev/null ; echo $? 514cd94aa94SAndy Fiddaman mark '9.12' ; $SED '/jj' 2>/dev/null ; echo $? 515cd94aa94SAndy Fiddaman mark '9.13' ; $SED 'a hello' 2>/dev/null ; echo $? 516cd94aa94SAndy Fiddaman mark '9.14' ; $SED 'a \ hello' 2>/dev/null ; echo $? 517cd94aa94SAndy Fiddaman mark '9.15' ; $SED 'b foo' 2>/dev/null ; echo $? 518cd94aa94SAndy Fiddaman mark '9.16' ; $SED 'd hello' 2>/dev/null ; echo $? 519cd94aa94SAndy Fiddaman mark '9.17' ; $SED 's/aa' 2>/dev/null ; echo $? 520cd94aa94SAndy Fiddaman mark '9.18' ; $SED 's/aa/' 2>/dev/null ; echo $? 521cd94aa94SAndy Fiddaman mark '9.19' ; $SED 's/a/b' 2>/dev/null ; echo $? 522cd94aa94SAndy Fiddaman mark '9.20' ; $SED 's/a/b/c/d' 2>/dev/null ; echo $? 523cd94aa94SAndy Fiddaman mark '9.21' ; $SED 's/a/b/ 1 2' 2>/dev/null ; echo $? 524cd94aa94SAndy Fiddaman mark '9.22' ; $SED 's/a/b/ 1 g' 2>/dev/null ; echo $? 525cd94aa94SAndy Fiddaman mark '9.23' ; $SED 's/a/b/w' 2>/dev/null ; echo $? 526cd94aa94SAndy Fiddaman mark '9.24' ; $SED 'y/aa' 2>/dev/null ; echo $? 527cd94aa94SAndy Fiddaman mark '9.25' ; $SED 'y/aa/b/' 2>/dev/null ; echo $? 528cd94aa94SAndy Fiddaman mark '9.26' ; $SED 'y/aa/' 2>/dev/null ; echo $? 529cd94aa94SAndy Fiddaman mark '9.27' ; $SED 'y/a/b' 2>/dev/null ; echo $? 530cd94aa94SAndy Fiddaman mark '9.28' ; $SED 'y/a/b/c/d' 2>/dev/null ; echo $? 531cd94aa94SAndy Fiddaman mark '9.29' ; $SED '!' 2>/dev/null ; echo $? 532cd94aa94SAndy Fiddaman mark '9.30' ; $SED supercalifrangolisticexprialidociussupercalifrangolisticexcius 2>/dev/null ; echo $? 533cd94aa94SAndy Fiddaman mark '9.31' ; $SED '' /dev/null 2>/dev/null ; echo $? 534cd94aa94SAndy Fiddaman} 535cd94aa94SAndy Fiddaman 536cd94aa94SAndy Fiddamanmain 537cd94aa94SAndy Fiddamanecho "Pass/fail - $pass/$fail" 538cd94aa94SAndy Fiddamanexit $err 539