aboutsummaryrefslogtreecommitdiff
path: root/tests/sed.test
blob: beb11d5ce5517568dfc5bad6d9d2bcbed7fe2844 (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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#!/bin/echo Run scripts/test.sh

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

testing 'as cat' 'sed ""' "one\ntwo\nthree" "" "one\ntwo\nthree"
# This segfaults ubuntu 12.04's sed. No really.
testing 'sed - - twice' 'sed "" - -' "hello\n" "" "hello\n"
testing '-n' 'sed -n ""' "" "" "one\ntwo\nthree"
testing '-n p' 'sed -n p' "one\ntwo\nthree" "" "one\ntwo\nthree"
testing '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 '-n $p' 'sed -n \$p' "three" "" "one\ntwo\nthree"
testing 'as cat #2' "sed -n '1,\$p'" "one\ntwo\nthree" "" "one\ntwo\nthree"
testing 'no input means no last line' "sed '\$a boing'" "" "" ""
testing '-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 '$ 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 'prodigal newline' "sed -n '1,\$p' - input" \
	"one\ntwo\nthree\nfour\n" "four\n" "one\ntwo\nthree"
testing 'Newline only added if further output' "sed -n 3p - input" "three" \
	"four\n" "one\ntwo\nthree"

# Fun with match delimiters and escapes
testing 'match \t tab' "sed -n '/\t/p'" "\tx\n" "" "\tx\n"
testing 'match t delim disables \t tab' "sed -n '\t\txtp'" "" "" "\tx\n"
testing 'match t delim makes \t literal t' \
	"sed -n '\t\txtp'" "tx\n" "" "tx\n"
testing 'match n delim' "sed -n '\n\txnp'" "\tx\n" "" "\tx\n"
testing 'match n delim disables \n newline' "sed -n '\n\nxnp'" "" "" "\nx\n"
toyonly testing 'match \n literal n' "sed -n '\n\nxnp'" "nx\n" "" "nx\n"
testing 'end match does not check starting match line' \
	"sed -n '/two/,/two/p'" "two\nthree" "" "one\ntwo\nthree"
testing 'end match/start match mixing number/letter' \
	"sed -n '2,/two/p'" "two\nthree" "" "one\ntwo\nthree"
testing 'num then regex' 'sed -n 2,/d/p' 'b\nc\nd\n' '' 'a\nb\nc\nd\ne\nf\n'
testing 'regex then num' 'sed -n /b/,4p' 'b\nc\nd\n' '' 'a\nb\nc\nd\ne\nf\n'
testing '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 'regex address overlap' 'sed -n /on/,/off/p' "on\nzap\noffon\n" "" \
	'on\nzap\noffon\nping\noff\n'
testing 'getdelim with nested [:blah:]' 'sed -n "sa\a[a[:space:]bc]*aXXagp"' \
	"ABXXCDXXEFXXGHXXIXX" "" "ABaaCDa EFaa aGHa a Ia "
testing '[ in [[]' "sed 's@[[]@X@g'" "X" "" "["
testing '[[] with ] as delimiter' "sed 's][[]]X]g'" "X" "" "["
testing '[[] with [ as delimiter' "sed 's[\[\[][X['" "X" "" "["

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

testing 'prodigaler newline' 'sed -e a\\ -e woo' 'one\nwoo\n' '' 'one'
testing "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 "b loop" "sed ':woo;=;b woo' | head -n 5" '1\n1\n1\n1\n1\n' "" "X"
testing "b skip" "sed -n '2b zap;d;:zap;p'" "two\n" "" "one\ntwo\nthree"
testing "b end" "sed -n '2b;p'" "one\nthree" "" "one\ntwo\nthree"
testing "c range" "sed '2,4c blah'" "one\nblah\nfive\nsix" "" \
	"one\ntwo\nthree\nfour\nfive\nsix"
testing "c {range}" "sed -e '2,4{c blah' -e '}'" \
	"one\nblah\nblah\nblah\nfive\nsix" \
        "" "one\ntwo\nthree\nfour\nfive\nsix"
testing "c multiple continuation" \
	"sed -e 'c\\' -e 'two\\' -e ''" "two\n\n" "" "hello"
toyonly testing "c empty continuation" "sed -e 'c\\'" "\n" "" "hello"
testing "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 '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 "match empty line" "sed -e 's/^\$/@/'" "@\n" "" "\n"

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

testing 'N flushes pending a and advances match counter' \
	"sed -e 'a woo' -e 'N;\$p'" 'woo\none\ntwo\none\ntwo' "" 'one\ntwo'
testing "delimiter in regex [char range] doesn't count" "sed -e 's/[/]//'" \
	"onetwo\n" "" 'one/two\n'
testing "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 "blank pattern repeats last pattern" \
	"sed -e '/^three/s//abc&def/'" \
	"one two three\nabcthreedef four five\nfive six seven\n" "" \
	"one two three\nthree four five\nfive six seven\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 -f - input" "blah\nboom\n" 'blah' '1a\\\nboom'
testing "" "sed '1a\
hello'" "merp\nhello\n" "" "merp"

testing "" "sed -e '/x/c\' -e 'y'" 'y\n' '' 'x\n'
testing "" "sed -e 's/a[([]*b/X/'" 'X' '' 'a[(b'
toyonly testing "" "sed 'y/a\\bc/de\f/'" "db\f" "" "abc"
testing "[a-a] (for perl)" "sed '"'s/\([^a-zA-Z0-9.:_\-\/]\)/\\\1/g'"'" \
  'he\ llo' "" "he llo"

# Debian bug https://bugs.debian.org/635570 added code to ensure a file
# ends with a newline via "sed -e '$a\'". Apparently all a\ with no additional
# pattern lines after it does (other than making posix throw up) is
# flush the pending newline as _if_ it had added another line. *shrug* Ok?
testing "trailing a\ (for debian)" "sed 'a\\'" "hello\n" "" "hello"

# You have to match the first line of a range in order to activate
# the range, numeric and ascii work the same way
toyonly testing "skip start of range" "sed -e n -e '1,2s/b/c/'" "a\nb\n" "" "a\nb\n"
testing "range +1" "sed -ne '/blah/,+1p'" "blah\n6\n" "" \
  "1\n2\n3\n4\n5\nblah\n6\n7\n8\n9\n"
testing "range +0" "sed -ne '/blah/,+0p'" "blah\n" "" \
  "1\n2\n3\n4\n5\nblah\n6\n7\n8\n9\n"
testing "range +3" "sed -ne '2,+3p'" "2\n3\n4\n5\n" "" \
  "1\n2\n3\n4\n5\nblah\n6\n7\n8\n9\n"

testing "not -s" "sed -n 1p input -" "one" "one" "two"
testing "-s" "sed -sn 1p input -" "one\ntwo" "one\n" "two"

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

testing "bonus backslashes" \
  "sed -e 'a \l \x\' -e \"\$(echo -e 'ab\\\nc')\"" \
  "hello\nl x\nab\nc\n" "" "hello\n"

# toybox saying "no }" here broke the AOSP build.
testing "end b with }" "sed -n '/START/{:a;n;/END/q;p;ba}'" "b\nc\n" \
  "" "a\nSTART\nb\nc\nEND\nd"

testing '-z' 'sed -z "s/\n/-/g"' "a-b-c" "" "a\nb\nc"

# toybox handling of empty capturing groups broke minjail. Check that we
# correctly replace an empty capturing group with the empty string:
testing '\n with empty capture' \
    'sed -E "s/(ARM_)?(NR_)([a-z]*) (.*)/\1\2\3/"' "NR_read" "" "NR_read foo"
# ...but also that we report an error for a backreference to a group that
# isn't in the pattern:
testing '\n too high' \
    'sed -E "s/(.*)/\2/p" 2>/dev/null || echo OK' "OK\n" "" "foo"

# Performance test
X=x; Y=20; while [ $Y -gt 0 ]; do X=$X$X; Y=$(($Y-1)); done
testing 'megabyte s/x/y/g (20 sec timeout)' \
  "timeout 20 sed 's/x/y/g' | sha1sum" \
  '138c1fa7c3f64186203b0192fb4abdb33cb4e98a  -\n' '' "$X\n"
unset X Y

testing 's i and I' 'sed s/o/0/ig' "f00l F00L" "" "fool FOOL"

# -i with $ last line test