Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/re/sed.tst
1808 views
# regression tests for the POSIX sed utility

function DATA
{
	for f
	do	test -f $f && continue
		case $f in
		[0-7][0-7][0-7])
			echo $f > $f
			chmod $f $f
			;;
		nul.in) print '\0AAAfooZZZ' > $f
			;;
		nul.out)print '\0AAAbarZZZ' > $f
			;;
		esac
	done
}

TEST 01 'empty script and passive command combinations'
	EXEC -f script -n
		NOTE '=, -n, blank lines'
		INPUT script $'\n=\n'
		INPUT - $'a\nb\nc'
		OUTPUT - $'1\n2\n3'
	EXEC -f script
		NOTE 'comments, including #n'
		INPUT script $'#n\n=\n#comment'
	EXEC -f script
		NOTE 'empty script'
		INPUT script
		OUTPUT - $'a\nb\nc'
	EXEC -f script
		NOTE 'do-nothing script'
		INPUT script $'# nothing\n'
	EXEC -f script
		NOTE 'substitution; regexp dot; &; substitution flag'
		INPUT script $'s/./&&/\n s/./&x/\n s/./&y/2\n s/./&z/5'
		OUTPUT - $'axya\nbxyb\ncxyc'

TEST 02 'line counting, ranges, overlaps'
	EXEC -f script
		NOTE 'd overlap'
		INPUT script $'1,2d\n 2,6d\n 4,5d\n 7,10d'
		INPUT - $'1\n2\n3\n4\n5\n6\n7\n8'
		OUTPUT - $'3\n6'
	EXEC -f script -e 1,2d -e 2,6d
		NOTE 'd disjoint range'
		INPUT script $'4,5d\n 7,10d'
	EXEC -f script -n
		NOTE 'd bypassing end of range'
		INPUT script $'2,5d\n 1,3p\n 1,6p'
		OUTPUT - $'1\n1\n6'
	EXEC -f script
		NOTE 'negation, address $, print'
		INPUT script $'3,$!d\n $d\n p\n 4,5d'
		OUTPUT - $'3\n3\n4\n5\n6\n6\n7\n7'

TEST 03 'regexp addresses, append, insert, change'
	EXEC -f script
		INPUT script $'/a/a\\\nA\\\nA\n/a/a\\\nB\n/d/i\\\nD\n/c/c\\\nC\\\nC\n$i\\\nE'
		INPUT - $'a\nb\nc\nd'
		OUTPUT - $'a\nA\nA\nB\nb\nC\nC\nD\nE\nd'

TEST 04 'braces'
	EXEC -f script
		INPUT script $'3,7{\n/a/s/a/&&/\n/b/,/./s/./&&&/\n}'
		INPUT - $'a\nb\na\nb\na\na\nb\na\nb'
		OUTPUT - $'a\nb\naa\nbbb\naaaa\naa\nbbb\na\nb'

TEST 05 'hold, get combinations'
	EXEC -f script
		NOTE 'hold, get'
		INPUT script $'$!H\n$!d\n$G'
		INPUT - $'1\n2\n3\n4'
		OUTPUT - $'4\n\n1\n2\n3'
	EXEC -f script
		NOTE 'hold, exchange, get, brace without newline'
		INPUT script $'1{h\nd\n}\n3x\n$g'
		OUTPUT - $'2\n1\n3'
	EXEC -f script
		NOTE 'quit'
		INPUT script $'a\\\nx\nq\n='
		OUTPUT - $'1\nx'

TEST 06 'next, regexp $'
	EXEC -f script
		INPUT script $'s/$/x/\nn\ns/./&y/\nN\ns/.../&z/\n='
		INPUT - $'a\nb\nc'
		OUTPUT - $'ax\n3\nby\nzc'

TEST 07 'substitute flag combinations'
	EXEC -f script -n
		NOTE 's newline p'
		INPUT script $'/../s/./&\\\n/\np\nP\ns/\\n//p'
		INPUT - $'a\nbc\nd'
		OUTPUT - $'a\na\nb\nc\nb\nbc\nd\nd'
	EXEC -f script -n
		NOTE 'write, flag w'
		INPUT script $'/../s/./&\\\n/\nw result\ns/\\n//w result'
		OUTPUT result $'a\nb\nc\nbc\nd'
		OUTPUT -
	EXEC -f script -n
		NOTE 's w file'
		INPUT script $'s/b/--/gw result'
		INPUT - $'abcabc'
		OUTPUT result $'a--ca--c'
	EXEC -f script -n
		NOTE 's pw file'
		INPUT script $'s/b/--/gpw result'
		OUTPUT result $'a--ca--c'
		OUTPUT - $'a--ca--c'
	EXEC -f script
		NOTE 's pw file'
		INPUT script $'s/b/--/gpw result'
		OUTPUT result $'a--ca--c'
		OUTPUT - $'a--ca--c\na--ca--c'

TEST 08 'character classes, flag g'
	EXEC -f script
		INPUT script $'1s/[a-z][a-z]*//\n2s/[[:digit:]][[:digit:]]*//\n3s/[^a-z]/X/g\n'
		INPUT - $'AZ`abyz{\n/0189:\na1b2c3d'
		OUTPUT - $'AZ`{\n/:\naXbXcXd'
	EXEC $'s/[\\]/X/g'
		INPUT - $'[]./:,\\'
		OUTPUT - $'[]./:,X'
	EXEC $'s/[^./]/X/g'
		OUTPUT - $'XX./XXX'
	EXEC $'s/[][]/X/g'
		OUTPUT - $'XX./:,\\'
	EXEC $'s.[.]\\..X.g'
		OUTPUT - $'[]X:,\\'

TEST 09 'null matches'
	EXEC -f script
		INPUT script $'1,2s/a*/x/g'
		INPUT - $'123\naaa'
		OUTPUT - $'x1x2x3x\nx'

TEST 10 'longest match, unmatched subexpressions'
	EXEC -f script
		INPUT script $'s/\\(...\\)*\\(..\\)*/:\\1:\\2:/'
		INPUT - $'abc\nabcd\nabcde\nabcdef\nabcdefg'
		OUTPUT - $':abc::\n::cd:\n:abc:de:\n:def::\n:abc:fg:'

TEST 11 'metacharacters in substition'
	EXEC -f script
		INPUT script $'1s/$/\\&/\n2s/$/\\b/\n3s/$/\\\\/\n4s/$/\\//\n5s&$&\\&&'
		INPUT - $'1\n2\n3\n4\n5'
		OUTPUT - $'1&\n2\b\n3\\\n4/\n5'

TEST 12 'branch combinations'
	EXEC -f script
		NOTE 'branches'
		INPUT script $':x\n/a/{\ns/a/x/\nbx\n}'
		INPUT - $'aaa\nb\nabca'
		OUTPUT - $'xxx\nb\nxbcx'
	EXEC -f script
		NOTE 'long labels may be truncated'
		INPUT script $':longlabel\n/a/s/a/x/\ntlonglabel'
	EXEC -f script
		NOTE 'jump to end of script'
		INPUT script $'3b\n/a/s/a/x/g'
		OUTPUT - $'xxx\nb\nabca'
	EXEC -f script -n
		NOTE 'end of bracket range'
		INPUT script $'/c/d\n/a/,/d/{\n\t/b/,/c/{\n\t\t=\n\t}\n}'
		INPUT - $'a\nb\nc\nd\na'
		OUTPUT - $'2\n4\n5'
	EXEC -f script
		NOTE 'end of change range'
		INPUT script $'/a/,/b/{\n\t/b/,/c/c\\\nx\n}'
		OUTPUT - $'a\nc\nd\nx'
	EXEC -f script
		NOTE 'end of change range'
		INPUT - $'a\nb\nc\na\nc\nb\nd'
		OUTPUT - $'a\nc\nx\nd'
	EXEC -f script
		NOTE 'end of change range'
		INPUT script $'/a/,/b/c\\\nc'
		INPUT - $'a\nb\na'
		OUTPUT - $'c\nc'

TEST 15 'weird delimiters, remembered expression'
	EXEC -f script
		INPUT script $'1s1\\(.\\)\\11\\11\n2s.\\(\\.\\)\\..\\.\\1.\n3s*\\(.\\)\\**\\*\\1*\n4s&\\(.\\)\\&&\\1\\&&\n\\1\\(\\1\\)\\11s//\\1/\n\\&\\(\\&\\)\\&&s//\\&b&/'
		INPUT - $'a1b\nabc\nabc\na&b\n11b\na&&'
		OUTPUT - $'1b\n.ac\n*c\naa&b\n1b\na&b&&'

TEST 16 '7680-char line, backreference'
	EXEC -f script
		INPUT script $'s/.*/&&&&&&&&/\ns//&&&&&&&&/\ns//&&&&&&&&/\nh\ns/[^8]//g\ns/^\\(.*\\)\\1\\1\\1$/\\1/\ns//\\1/\ns//\\1/\ns//\\1/p\ng\ns/^\\(.*\\)\\1\\1\\1$/\\1/\ns//\\1/\ns//\\1/\ns//\\1/\ns/\\(.*\\)\\1/\\1/'
		INPUT - $'123456787654321'
		OUTPUT - $'88\n123456787654321'

TEST 17 'r from w file, nonexistent r'
	EXEC -f script -n
		INPUT script $'r not_a_file\nr OUTPUT\nw OUTPUT'
		INPUT - $'1\n2\n3'
		OUTPUT - $'1\n1\n2\n1\n2\n3'

TEST 18 'eof combinations'
	EXEC -f script
		NOTE 'eof in n'
		INPUT script $'a\\\n1\nn'
		INPUT - $'a'
		OUTPUT - $'a\n1'
	EXEC -f script
		NOTE 'eof in N'
		INPUT script $'a\\\n1\nN'
		OUTPUT - $'1'

TEST 19 'transliterate'
	EXEC -f script
		INPUT script $'y/abc/ABC/\ny:/\\\\\\:.:\\/.\\::'
		INPUT - $'abcABCabcdef\n1/:2.'
		OUTPUT - $'ABCABCABCdef\n1\\.2:'
	EXEC -f script
		INPUT script $'y/(/\\n/;y/)/\\n/'
		INPUT - $'(a)(b)(c)'
		OUTPUT - $'\na\n\nb\n\nc\n'

TEST 20 'N, D, G combinations'
	EXEC -f script
		NOTE 'N, D'
		INPUT script $'=\nN\np\nD\ns/.*/x/'
		INPUT - $'a\nb\nc'
		OUTPUT - $'1\na\nb\n2\nb\nc\n3'
	EXEC -f script
		NOTE 'D, G initial states'
		INPUT script $'1D\nG\nh'
		OUTPUT - $'b\n\nc\nb\n'

TEST 21 'a,c,r interaction'
	EXEC -f script
		INPUT script $'$!a\\\nA\n$!r INPUT\n$!a\\\nB\n1,2c\\\nC'
		INPUT - $'a\nb\nc'
		OUTPUT - $'A\na\nb\nc\nB\nC\nA\na\nb\nc\nB\nc'

TEST 22 'substitution null string combinations'
	EXEC -f script
		NOTE 'global substitution for null string'
		INPUT script $'s/a*/b/g'
		INPUT - $'aaa\nccc'
		OUTPUT - $'b\nbcbcbcb'
		NOTE 'count 1 substitution for null string'
	EXEC -f script
		INPUT script $'s/a*/b/1'
		OUTPUT - $'b\nbccc'
		NOTE 'count 2 substitution for null string'
	EXEC -f script
		INPUT script $'s/a*/b/2'
		OUTPUT - $'aaa\ncbcc'
	EXEC -f script
		NOTE 'count 3 substitution for null string'
		INPUT script $'s/a*/b/3'
		OUTPUT - $'aaa\nccbc'

TEST 23 'perverse semicolons'
	EXEC $'s;\\;;x;'
		INPUT - $'a;b'
		OUTPUT - $'axb'

TEST 24 'multiple files'
	EXEC -n '$=' INPUT INPUT INPUT
		INPUT - $'a;\nb;\nc'
		OUTPUT - $'9'

TEST 25 'weird chars, line folding'
	EXEC -n $'s/.*/&&&&&&&&&&/\nH\nH\nH\nG\nl'
		INPUT - $'\ta\a\\\n'
		OUTPUT - $'\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\\n\\n\\n\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\\n\\a\\\\\\n\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\t\\\na\\a\\\\\\n\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\\n\\ta\\a\\\\$\n\\n\\n\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\\n\\a\\\\\\n\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\t\\\na\\a\\\\\\n\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\ta\\a\\\\\\\n\\ta\\a\\\\\\n\\n\\n$'
	EXEC -n $'s/.*/&&&&&&&&&&/\nH\nH\nH\nG\nl'
		INPUT - $'\ta\002\\\n'
		OUTPUT - $'\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\n\\\\\\ta\\002\\\\\\ta\\002\\\\\\n\\n\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\t\\\na\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\n\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\n\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\n\\ta\\\n\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\t\\\na\\002\\\\\\ta\\002\\\\$\n\\n\\n\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\\n\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\n\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\\n\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\n\\ta\\002\\\\\\ta\\002\\\\\\ta\\\n\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\ta\\002\\\\\\n\\\n\\n\\n$'

TEST 26 'multiple w files, multiple inputs, OUTPUT1 empty'
	EXEC -f script -n
		INPUT - $'1\n2\n3\n4\n5\n6\n7\n8\n9'
		INPUT script $'9,$d\nw out9\n8,$d\nw out8\n7,$d\nw out7\n6,$d\nw out6\n5,$d\nw out5\n4,$d\nw out4\n3,$d\nw out3\n2,$d\nw out2\n1,$d\nw out1'
		OUTPUT -n out1
		OUTPUT out2 $'1'
		OUTPUT out3 $'1\n2'
		OUTPUT out4 $'1\n2\n3'
		OUTPUT out5 $'1\n2\n3\n4'
		OUTPUT out6 $'1\n2\n3\n4\n5'
		OUTPUT out7 $'1\n2\n3\n4\n5\n6'
		OUTPUT out8 $'1\n2\n3\n4\n5\n6\n7'
		OUTPUT out9 $'1\n2\n3\n4\n5\n6\n7\n8'

TEST 27 'assorted warnings'
	DIAGNOSTICS
	EXEC -n /o/p
		NOTE 'trailing newline omitted'
		INPUT -n - $'hello\ngoodbye'
		OUTPUT - $'hello\ngoodbye'

TEST 28 'assorted diagnostics'
	DIAGNOSTICS
	EXEC = not_a_file
	EXEC -e :x -e :x
	EXEC r/dev/null
	EXEC -f not_a_file
	EXEC
	EXEC 0p
	EXEC //p
	EXEC bx
	EXEC /
	EXEC /a
	EXEC $'/\\'
	EXEC /a/
	EXEC 1,c
	EXEC 1,/
	EXEC 1,2,3p
	EXEC $'/\\(/p'
	EXEC $'/\\1/p'
	EXEC s/a/b
	EXEC s/a/b/q
	EXEC s/a/b/3g3
	EXEC s/a/b/gg
	EXEC s/a/b/pp
	EXEC s/a/b/wnot_a_file
	EXEC y/a
	EXEC y/a/
	EXEC y/a/b
	EXEC y/aa/bb/
	EXEC y/aa/ab/
	EXEC y/a/bb/
	EXEC y/aa/b/
	EXEC 1,2=
	EXEC 1,2q
	EXEC :
	EXEC $'\\'
	EXEC a
	EXEC c
	EXEC e
	EXEC f
	EXEC i
	EXEC j
	EXEC k
	EXEC m
	EXEC o
	EXEC r
	EXEC s
	EXEC u
	EXEC v
	EXEC w
	EXEC y
	EXEC z
	EXEC $'{'
	EXEC $'}'
	EXEC 1
	EXEC pq
	EXEC dq
	EXEC aq
	EXEC $'!!p'
	EXEC $'1#'
	EXEC $'a\\'
	EXEC $'w .'
	EXEC $'s /a/b/'
	EXEC $'s/a/b/w .'

TEST 29 'customary extensions'
BODY {
	COMMAND '=;=' </dev/null 2>/dev/null && a=yes || a=no
	INFO "$a" 'semicolon usable as newline'
	case $a in
	*y*)	a=$(print no | COMMAND ':x;s/no/yes/' 2>/dev/null)
		INFO "$a" 'semicolon terminates a label'
		COMMAND '=;  =' </dev/null 2>/dev/null && a=yes || a=no
		INFO "$a" 'space after semicolon'
		COMMAND '=  ;=' </dev/null 2>/dev/null && a=yes || a=no
		INFO "$a" 'space before semicolon'
		;;
	esac
	COMMAND '/a/s///' </dev/null 2>/dev/null && a=yes || a=no
	INFO "$a" 'previous regular expression can be abbreviated as //'
	case $a in
	*y*)	a=$(print ab | COMMAND '
			/a/bx
      				/b/=
			:x
			s///
			/a/s/.*/static/
			/b/s/.*/dynamic/
		')
		INFO "$a" 'label scope'
		;;
	esac
	COMMAND 'w/dev/null' </dev/null 2>/dev/null && a=yes || a=no
	INFO "$a" 'space optional in r and w commands'
	COMMAND '/\y/b' </dev/null 2>/dev/null && a=yes || a=no
	INFO "$a" '\ may precede a non-special character in regular expression'
	COMMAND 's/x/\y/' </dev/null 2>/dev/null && a=yes || a=no
	INFO "$a" '\ may precede a non-special character in substitution text'
	COMMAND '1 , 2p' </dev/null 2>/dev/null && a=yes || a=no
	INFO "$a" 'spaces allowed between addresses'
}

TEST 30 'hold buffer line join'
	EXEC -One '
/^Package:/{
s/^Package:[[:space:]]*\<\([[:alnum:].+-]*$1[[:alnum:].+-]*\).*/\1/
h
}
/^Description:/{
s/^Description:[[:space:]]*\(.*\)/\1/
H
g
s/\
/ - /
p
}
'
		INPUT - 'Package: grep
Essential: yes
Priority: required
Section: base
Installed-Size: 488
Debian-Maintainer: Wichert Akkerman <[email protected]>
Maintainer: Carl Worth <[email protected]>
Architecture: arm
Version: 2.4.2-1
Provides: rgrep
Pre-Depends: libc6 (>= 2.1.2)
Conflicts: rgrep
Filename: ./grep_2.4.2-1_arm.ipk
Size: 119438
MD5Sum: 67fa4cb756f951fda7b7a5d4da2ab523
Description: GNU grep, egrep and fgrep.
 The GNU family of grep utilities may be the "fastest grep in the west".
 GNU grep is based on a fast lazy-state deterministic matcher (about
 twice as fast as stock Unix egrep) hybridized with a Boyer-Moore-Gosper
 search for a fixed string that eliminates impossible text from being
 considered by the full regexp matcher without necessarily having to
 look at every character. The result is typically many times faster
 than Unix grep or egrep. (Regular expressions containing backreferencing
 will run more slowly, however.)

Package: sed
Priority: required
Section: base
Installed-Size: 180
Debian-Maintainer: Wichert Akkerman <[email protected]>
Maintainer: Carl Worth <[email protected]>
Architecture: arm
Version: 3.02-6
Pre-Depends: libc6 (>= 2.1.2)
Filename: ./sed_3.02-6_arm.ipk
Size: 12338
MD5Sum: c893daf6fef70813b566db8ed8c06950
Description: The GNU sed stream editor.
 sed reads the specified files or the standard input if no
 files are specified, makes editing changes according to a
 list of commands, and writes the results to the standard
 output.'
		OUTPUT - 'Package: grep - GNU grep, egrep and fgrep.
Package: sed - The GNU sed stream editor.'

TEST 31 'file access'
	DATA 000 644
	DIAGNOSTICS
	EXEC 's/./x/' 000 644
		OUTPUT - $'x44'
	EXEC 's/./x/' 644 000

TEST 32 'embedded \0'
	DATA nul.in nul.out
	EXEC 's/foo/bar/' nul.in
		SAME OUTPUT nul.out

TEST 33 'multibyte'
	EXPORT LC_CTYPE=C.UTF-8

	EXEC $'y/\303\240\303\242\303\251\303\250\303\252\303\253\303\256\303\257\303\264\303\266\303\271\303\273\303\247/aaeeeeiioouuc/'
		INPUT - $'chaine de caract\303\250res d\303\251finie en utf-8'
		OUTPUT - $'chaine de caracteres definie en utf-8'

	EXEC $'y\342\202\254\303\240\303\242\303\251\303\250\303\252\303\253\303\256\303\257\303\264\303\266\303\271\303\273\303\247\342\202\254aaeeeeiioouuc\342\202\254'