summaryrefslogtreecommitdiff
path: root/tests/sed.test
blob: 9f2956f803c880c7a903d4df86924de9bcc6cb64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/bin/echo Run scripts/test.sh

#testing "name" "command" "result" "infile" "stdin"

testing 'sed as cat' 'sed ""' "one\ntwo\nthree" "" "one\ntwo\nthree"
# This segfaults ubuntu 12.04's sed. No really.
SKIP_HOST=1 testing 'sed - - twice' 'sed "" - -' "hello\n" "" "hello\n"
testing 'sed -n' 'sed -n ""' "" "" "one\ntwo\nthree"
testing 'sed -n p' 'sed -n p' "one\ntwo\nthree" "" "one\ntwo\nthree"
testing 'sed explicit pattern' 'sed -e p -n' "one\ntwo\nthree" "" \
	"one\ntwo\nthree"

# Exploring the wonders of sed addressing modes
testing '' 'sed -n 1p' "one\n" "" "one\ntwo\nthree"
testing '' 'sed 2p' "one\ntwo\ntwo\nthree" "" "one\ntwo\nthree"
testing '' 'sed -n 2p' "two\n" "" "one\ntwo\nthree"
testing 'sed -n $p' 'sed -n \$p' "three" "" "one\ntwo\nthree"
testing 'sed as cat #2' "sed -n '1,\$p'" "one\ntwo\nthree" "" "one\ntwo\nthree"
testing 'sed no input means no last line' "sed '\$a boing'" "" "" ""
testing 'sed -n $,$p' 'sed -n \$,\$p' 'three' '' 'one\ntwo\nthree'
testing '' 'sed -n 1,2p' "one\ntwo\n" "" "one\ntwo\nthree"
testing '' 'sed -n 2,3p' "two\nthree" "" "one\ntwo\nthree"
testing '' 'sed -n 2,1p' "two\n" "" "one\ntwo\nthree"
testing 'sed $ with 2 inputs' 'sed -n \$p - input' "four\n" "four\n" \
	"one\ntwo\nthree"
testing '' 'sed -n /two/p' "two\n" "" "one\ntwo\nthree"
testing '' 'sed -n 1,/two/p' 'one\ntwo\n' '' 'one\ntwo\nthree'
testing '' 'sed -n /one/,2p' 'one\ntwo\n' '' 'one\ntwo\nthree'
testing '' 'sed -n 1,/one/p' 'one\ntwo\nthree' '' 'one\ntwo\nthree'
testing '' 'sed -n /one/,1p' 'one\n' '' 'one\ntwo\nthree'
testing 'sed -n /two/,$p' 'sed -n /two/,\$p' 'two\nthree' '' 'one\ntwo\nthree'


# Fun with newlines!
testing '' 'sed -n 3p' "three" "" "one\ntwo\nthree"
testing 'sed prodigal newline' "sed -n '1,\$p' - input" \
	"one\ntwo\nthree\nfour\n" "four\n" "one\ntwo\nthree"
testing 'sed Newline only added if further output' "sed -n 3p - input" "three" \
	"four\n" "one\ntwo\nthree"

# Fun with match delimiters and escapes
testing 'sed match \t tab' "sed -n '/\t/p'" "\tx\n" "" "\tx\n"
testing 'sed match t delim disables \t tab' "sed -n '\t\txtp'" "" "" "\tx\n"
testing 'sed match t delim makes \t literal t' \
	"sed -n '\t\txtp'" "tx\n" "" "tx\n"
testing 'sed match n delim' "sed -n '\n\txnp'" "\tx\n" "" "\tx\n"
testing 'sed match n delim disables \n newline' "sed -n '\n\nxnp'" "" "" "\nx\n"
SKIP_HOST=1 testing 'sed match \n literal n' "sed -n '\n\nxnp'" "nx\n" "" "nx\n"
testing 'sed end match does not check starting match line' \
	"sed -n '/two/,/two/p'" "two\nthree" "" "one\ntwo\nthree"
testing 'sed end match/start match mixing number/letter' \
	"sed -n '2,/two/p'" "two\nthree" "" "one\ntwo\nthree"
testing 'sed num then regex' 'sed -n 2,/d/p' 'b\nc\nd\n' '' 'a\nb\nc\nd\ne\nf\n'
testing 'sed regex then num' 'sed -n /b/,4p' 'b\nc\nd\n' '' 'a\nb\nc\nd\ne\nf\n'
testing 'sed multiple regex address match' 'sed -n /on/,/off/p' \
	'bone\nturtle\scoff\ntron\nlurid\noffer\n'  "" \
	'zap\nbone\nturtle\scoff\nfred\ntron\nlurid\noffer\nbecause\n'
testing 'sed regex address overlap' 'sed -n /on/,/off/p' "on\nzap\noffon\n" "" \
	'on\nzap\noffon\nping\noff\n'

# gGhHlnNpPqrstwxy:=
# s///#comment
# abcdDi

testing 'sed prodigaler newline' 'sed -e a\\ -e woo' 'one\nwoo\n' '' 'one'
testing "sed aci" \
	"sed -e '3a boom' -e '/hre/i bang' -e '3a whack' -e '3c bong'" \
	"one\ntwo\nbang\nbong\nboom\nwhack\nfour\n" "" \
	"one\ntwo\nthree\nfour\n"
testing "sed b loop" "sed ':woo;=;b woo' | head -n 5" '1\n1\n1\n1\n1\n' "" "X"
testing "sed b skip" "sed -n '2b zap;d;:zap;p'" "two\n" "" "one\ntwo\nthree"
testing "sed b end" "sed -n '2b;p'" "one\nthree" "" "one\ntwo\nthree"
testing "sed c range" "sed '2,4c blah'" "one\nblah\nfive\nsix" "" \
	"one\ntwo\nthree\nfour\nfive\nsix"
testing "sed c {range}" "sed -e '2,4{c blah' -e '}'" \
	"one\nblah\nblah\nblah\nfive\nsix" \
        "" "one\ntwo\nthree\nfour\nfive\nsix"
testing "sed c multiple continuation" \
	"sed -e 'c\\' -e 'two\\' -e ''" "two\n\n" "" "hello"
testing "sed D further processing depends on whether line is blank" \
	"sed -e '/one/,/three/{' -e 'i meep' -e'N;2D;}'" \
	"meep\nmeep\ntwo\nthree\n" "" "one\ntwo\nthree\n"
testing 'sed newline staying away' 'sed s/o/x/' 'xne\ntwx' '' 'one\ntwo'

# Why on _earth_ is this not an error? There's a \ with no continuation!
#testing 'sed what, _really_?' 'sed -e a\\ && echo yes really' \
#	'one\nyes really\n' '' 'one\n'

# all the s/// test

testing "sed match empty line" "sed -e 's/^\$/@/'" "@\n" "" "\n"

testing 'sed \1' "sed 's/t\\(w\\)o/za\\1py/'" "one\nzawpy\nthree" "" \
	"one\ntwo\nthree"
testing 'sed \1 p' "sed 's/t\\(w\\)o/za\\1py/p'" "one\nzawpy\nzawpy\nthree" \
	"" "one\ntwo\nthree"
testing 'sed \1 no newline' "sed 's/t\\(w\\)o/za\\1py/'" "one\nzawpy" "" \
	"one\ntwo"
testing 'sed \1 p no newline' "sed 's/t\\(w\\)o/za\\1py/p'" \
	"one\nzawpy\nzawpy" "" "one\ntwo"
testing 'sed -n s//\1/p' "sed -n 's/t\\(w\\)o/za\\1py/p'" "zawpy" "" "one\ntwo"
testing 'sed -n s//\1/p no newline' "sed -n 's/t\\(w\\)o/za\\1py/p'" "zawpy" \
	"" "one\ntwo"
testing 'sed backref error' \
	"sed 's/w/ale \2 ha/' >/dev/null 2>/dev/null || echo no" \
	"no\n" "" "one\ntwo\nthree"
testing 'sed empty match after nonempty match' "sed -e 's/a*/c/g'" 'cbcncgc' \
	'' 'baaang'
testing 'sed empty match' "sed -e 's/[^ac]*/A/g'" 'AaAcA' '' 'abcde'
testing 'sed s///#comment' "sed -e 's/TWO/four/i#comment'" "one\nfour\nthree" \
	"" "one\ntwo\nthree"

testing 'sed N flushes pending a and advances match counter' \
	"sed -e 'a woo' -e 'N;\$p'" 'woo\none\ntwo\none\ntwo' "" 'one\ntwo'
testing "sed delimiter in regex [char range] doesn't count" "sed -e 's/[/]//'" \
	"onetwo\n" "" 'one/two\n'
testing "sed delete regex range start line after trigger" \
	"sed -e '/one/,/three/{' -e 'i meep' -e '1D;}'" \
	"meep\nmeep\ntwo\nmeep\nthree" "" "one\ntwo\nthree"
testing "sed D further processing depends on whether line is blank" \
	"sed -e '/one/,/three/{' -e 'i meep' -e'N;2D;}'" \
	"meep\nmeep\ntwo\nthree\n" "" "one\ntwo\nthree\n"

# Different ways of parsing line continuations

testing "" "sed -e '1a\' -e 'huh'" "meep\nhuh\n" "" "meep"
testing "" "sed -f input" "blah\nboom\n" '1a\\\nboom' 'blah'
testing "" "sed '1a\
hello'" "merp\nhello\n" "" "merp"
#echo meep | sed/sed -e '1a\' -e 'huh'
#echo blah | sed/sed -f <(echo -e "1a\\\\\nboom")
#echo merp | sed/sed "1a\\
#hello"

testing "sed bonus backslashes" \
  "sed -e 'a \l \x\' -e \"\$(echo -e 'ab\\\nc')\"" \
  "hello\nl x\nab\nc\n" "" "hello\n"
# -i with $ last line test

exit $FAILCOUNT