source: MondoRescue/branches/3.3/mindi-busybox/testsuite/sed.tests@ 3647

Last change on this file since 3647 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

  • Property svn:executable set to *
File size: 12.6 KB
Line 
1#!/bin/sh
2
3# SUSv3 compliant sed tests.
4# Copyright 2005 by Rob Landley <rob@landley.net>
5# Licensed under GPLv2, see file LICENSE in this source tree.
6
7. ./testing.sh
8
9# testing "description" "commands" "result" "infile" "stdin"
10
11# Corner cases
12testing "sed no files (stdin)" 'sed ""' "hello\n" "" "hello\n"
13testing "sed explicit stdin" 'sed "" -' "hello\n" "" "hello\n"
14testing "sed handles empty lines" "sed -e 's/\$/@/'" "@\n" "" "\n"
15testing "sed stdin twice" 'sed "" - -' "hello" "" "hello"
16
17# Trailing EOF.
18# Match $, at end of each file or all files?
19
20# -e corner cases
21# without -e
22# multiple -e
23# interact with a
24# -eee arg1 arg2 arg3
25# -f corner cases
26# -e -f -e
27# -n corner cases
28# no newline at EOF?
29# -r corner cases
30# Just make sure it works.
31# -i corner cases:
32# sed -i -
33# permissions
34# -i on a symlink
35# on a directory
36# With $ last-line test
37# Continue with \
38# End of script with trailing \
39
40# command list
41testing "sed accepts blanks before command" "sed -e '1 d'" "" "" ""
42testing "sed accepts newlines in -e" "sed -e 'i\
431
44a\
453'" "1\n2\n3\n" "" "2\n"
46testing "sed accepts multiple -e" "sed -e 'i\' -e '1' -e 'a\' -e '3'" \
47 "1\n2\n3\n" "" "2\n"
48
49# substitutions
50testing "sed -n" "sed -n -e s/foo/bar/ -e s/bar/baz/" "" "" "foo\n"
51testing "sed with empty match" "sed 's/z*//g'" "string\n" "" "string\n"
52testing "sed s//p" "sed -e s/foo/bar/p -e s/bar/baz/p" "bar\nbaz\nbaz\n" \
53 "" "foo\n"
54testing "sed -n s//p" "sed -ne s/abc/def/p" "def\n" "" "abc\n"
55testing "sed s//g (exhaustive)" "sed -e 's/[[:space:]]*/,/g'" ",1,2,3,4,5,\n" \
56 "" "12345\n"
57testing "sed s arbitrary delimiter" "sed -e 's woo boing '" "boing\n" "" "woo\n"
58testing "sed s chains" "sed -e s/foo/bar/ -e s/bar/baz/" "baz\n" "" "foo\n"
59testing "sed s chains2" "sed -e s/foo/bar/ -e s/baz/nee/" "bar\n" "" "foo\n"
60testing "sed s [delimiter]" "sed -e 's@[@]@@'" "onetwo" "" "one@two"
61testing "sed s with \\t (GNU ext)" "sed 's/\t/ /'" "one two" "" "one\ttwo"
62
63# branch
64testing "sed b (branch)" "sed -e 'b one;p;: one'" "foo\n" "" "foo\n"
65testing "sed b (branch with no label jumps to end)" "sed -e 'b;p'" \
66 "foo\n" "" "foo\n"
67
68# test and branch
69testing "sed t (test/branch)" "sed -e 's/a/1/;t one;p;: one;p'" \
70 "1\n1\nb\nb\nb\nc\nc\nc\n" "" "a\nb\nc\n"
71testing "sed t (test/branch clears test bit)" "sed -e 's/a/b/;:loop;t loop'" \
72 "b\nb\nc\n" "" "a\nb\nc\n"
73testing "sed T (!test/branch)" "sed -e 's/a/1/;T notone;p;: notone;p'" \
74 "1\n1\n1\nb\nb\nc\nc\n" "" "a\nb\nc\n"
75
76test x"$SKIP_KNOWN_BUGS" = x"" && {
77# Normal sed end-of-script doesn't print "c" because n flushed the pattern
78# space. If n hits EOF, pattern space is empty when script ends.
79# Query: how does this interact with no newline at EOF?
80testing "sed n (flushes pattern space, terminates early)" "sed -e 'n;p'" \
81 "a\nb\nb\nc\n" "" "a\nb\nc\n"
82}
83# non-GNU sed: N does _not_ flush pattern space, therefore c is eaten @ script end
84# GNU sed: N flushes pattern space, therefore c is printed too @ script end
85testing "sed N (flushes pattern space (GNU behavior))" "sed -e 'N;p'" \
86 "a\nb\na\nb\nc\n" "" "a\nb\nc\n"
87
88testing "sed N test2" "sed ':a;N;s/\n/ /;ta'" \
89 "a b c\n" "" "a\nb\nc\n"
90
91testing "sed N test3" "sed 'N;s/\n/ /'" \
92 "a b\nc\n" "" "a\nb\nc\n"
93
94testing "sed address match newline" 'sed "/b/N;/b\\nc/i woo"' \
95 "a\nwoo\nb\nc\nd\n" "" "a\nb\nc\nd\n"
96
97# Multiple lines in pattern space
98testing "sed N (stops at end of input) and P (prints to first newline only)" \
99 "sed -n 'N;P;p'" "a\na\nb\n" "" "a\nb\nc\n"
100
101# Hold space
102testing "sed G (append hold space to pattern space)" 'sed G' "a\n\nb\n\nc\n\n" \
103 "" "a\nb\nc\n"
104#testing "sed g/G (swap/append hold and patter space)"
105#testing "sed g (swap hold/pattern space)"
106
107testing "sed d ends script iteration" \
108 "sed -e '/ook/d;s/ook/ping/p;i woot'" "" "" "ook\n"
109testing "sed d ends script iteration (2)" \
110 "sed -e '/ook/d;a\' -e 'bang'" "woot\nbang\n" "" "ook\nwoot\n"
111
112# Multiple files, with varying newlines and NUL bytes
113test x"$SKIP_KNOWN_BUGS" = x"" && {
114testing "sed embedded NUL" "sed -e 's/woo/bang/'" "\0bang\0woo\0" "" \
115 "\0woo\0woo\0"
116}
117testing "sed embedded NUL g" "sed -e 's/woo/bang/g'" "bang\0bang\0" "" \
118 "woo\0woo\0"
119test x"$SKIP_KNOWN_BUGS" = x"" && {
120$ECHO -e "/woo/a he\0llo" > sed.commands
121testing "sed NUL in command" "sed -f sed.commands" "woo\nhe\0llo\n" "" "woo"
122rm sed.commands
123}
124
125# sed has funky behavior with newlines at the end of file. Test lots of
126# corner cases with the optional newline appending behavior.
127
128testing "sed normal newlines" "sed -e 's/woo/bang/' input -" "bang\nbang\n" \
129 "woo\n" "woo\n"
130testing "sed leave off trailing newline" "sed -e 's/woo/bang/' input -" \
131 "bang\nbang" "woo\n" "woo"
132testing "sed autoinsert newline" "sed -e 's/woo/bang/' input -" "bang\nbang" \
133 "woo" "woo"
134testing "sed empty file plus cat" "sed -e 's/nohit//' input -" "one\ntwo" \
135 "" "one\ntwo"
136testing "sed cat plus empty file" "sed -e 's/nohit//' input -" "one\ntwo" \
137 "one\ntwo" ""
138testing "sed append autoinserts newline" "sed -e '/woot/a woo' -" \
139 "woot\nwoo\n" "" "woot"
140testing "sed append autoinserts newline 2" "sed -e '/oot/a woo' - input" \
141 "woot\nwoo\nboot\nwoo\n" "boot" "woot"
142testing "sed append autoinserts newline 3" "sed -e '/oot/a woo' -i input && cat input" \
143 "boot\nwoo\n" "boot" ""
144testing "sed insert doesn't autoinsert newline" "sed -e '/woot/i woo' -" \
145 "woo\nwoot" "" "woot"
146testing "sed print autoinsert newlines" "sed -e 'p' -" "one\none" "" "one"
147testing "sed print autoinsert newlines two files" "sed -e 'p' input -" \
148 "one\none\ntwo\ntwo" "one" "two"
149testing "sed noprint, no match, no newline" "sed -ne 's/woo/bang/' input" \
150 "" "no\n" ""
151testing "sed selective matches with one nl" "sed -ne 's/woo/bang/p' input -" \
152 "a bang\nc bang\n" "a woo\nb no" "c woo\nd no"
153testing "sed selective matches insert newline" \
154 "sed -ne 's/woo/bang/p' input -" "a bang\nb bang\nd bang" \
155 "a woo\nb woo" "c no\nd woo"
156testing "sed selective matches noinsert newline" \
157 "sed -ne 's/woo/bang/p' input -" "a bang\nb bang" "a woo\nb woo" \
158 "c no\nd no"
159testing "sed clusternewline" \
160 "sed -e '/one/a 111' -e '/two/i 222' -e p input -" \
161 "one\none\n111\n222\ntwo\ntwo" "one" "two"
162testing "sed subst+write" \
163 "sed -e 's/i/z/' -e 'woutputw' input -; $ECHO -n X; cat outputw" \
164 "thzngy\nagaznXthzngy\nagazn" "thingy" "again"
165rm outputw
166testing "sed trailing NUL" \
167 "sed 's/i/z/' input -" \
168 "a\0b\0\nc" "a\0b\0" "c"
169testing "sed escaped newline in command" \
170 "sed 's/a/z\\
171z/' input" \
172 "z\nz" "a" ""
173
174# Test end-of-file matching behavior
175
176testing "sed match EOF" "sed -e '"'$p'"'" "hello\nthere\nthere" "" \
177 "hello\nthere"
178testing "sed match EOF two files" "sed -e '"'$p'"' input -" \
179 "one\ntwo\nthree\nfour\nfour" "one\ntwo" "three\nfour"
180# sed match EOF inline: gnu sed 4.1.5 outputs this:
181#00000000 6f 6e 65 0a 6f 6f 6b 0a 6f 6f 6b 0a 74 77 6f 0a |one.ook.ook.two.|
182#00000010 0a 74 68 72 65 65 0a 6f 6f 6b 0a 6f 6f 6b 0a 66 |.three.ook.ook.f|
183#00000020 6f 75 72 |our|
184# which looks buggy to me.
185$ECHO -ne "three\nfour" > input2
186testing "sed match EOF inline" \
187 "sed -e '"'$i ook'"' -i input input2 && cat input input2" \
188 "one\nook\ntwothree\nook\nfour" "one\ntwo" ""
189rm input2
190
191# Test lie-to-autoconf
192
193testing "sed lie-to-autoconf" "sed --version | grep -o 'GNU sed version '" \
194 "GNU sed version \n" "" ""
195
196# Jump to nonexistent label
197test x"$SKIP_KNOWN_BUGS" = x"" && {
198# Incompatibility: illegal jump is not detected if input is ""
199# (that is, no lines at all). GNU sed 4.1.5 complains even in this case
200testing "sed nonexistent label" "sed -e 'b walrus' 2>/dev/null || echo yes" \
201 "yes\n" "" ""
202}
203
204testing "sed backref from empty s uses range regex" \
205 "sed -e '/woot/s//eep \0 eep/'" "eep woot eep" "" "woot"
206
207testing "sed backref from empty s uses range regex with newline" \
208 "sed -e '/woot/s//eep \0 eep/'" "eep woot eep\n" "" "woot\n"
209
210# -i with no filename
211
212touch ./- # Detect gnu failure mode here.
213testing "sed -i with no arg [GNUFAIL]" "sed -e '' -i 2> /dev/null || echo yes" \
214 "yes\n" "" ""
215rm ./- # Clean up
216
217testing "sed s/xxx/[/" "sed -e 's/xxx/[/'" "[\n" "" "xxx\n"
218
219# Ponder this a bit more, why "woo not found" from gnu version?
220#testing "sed doesn't substitute in deleted line" \
221# "sed -e '/ook/d;s/ook//;t woo;a bang;'" "bang" "" "ook\n"
222
223# This makes both seds very unhappy. Why?
224#testing "sed -g (exhaustive)" "sed -e 's/[[:space:]]*/,/g'" ",1,2,3,4,5," \
225# "" "12345"
226
227# testing "description" "commands" "result" "infile" "stdin"
228
229testing "sed n command must reset 'substituted' bit" \
230 "sed 's/1/x/;T;n;: next;s/3/y/;t quit;n;b next;: quit;q'" \
231 "0\nx\n2\ny\n" "" "0\n1\n2\n3\n"
232
233testing "sed d does not break n,m matching" \
234 "sed -n '1d;1,3p'" \
235 "second\nthird\n" "" "first\nsecond\nthird\nfourth\n"
236
237testing "sed d does not break n,regex matching" \
238 "sed -n '1d;1,/hir/p'" \
239 "second\nthird\n" "" "first\nsecond\nthird\nfourth\n"
240
241testing "sed d does not break n,regex matching #2" \
242 "sed -n '1,5d;1,/hir/p'" \
243 "second2\nthird2\n" "" \
244 "first\nsecond\nthird\nfourth\n""first2\nsecond2\nthird2\nfourth2\n"
245
246testing "sed 2d;2,1p (gnu compat)" \
247 "sed -n '2d;2,1p'" \
248 "third\n" "" \
249 "first\nsecond\nthird\nfourth\n"
250
251# Regex means: "match / at BOL or nothing, then one or more not-slashes".
252# The bug was that second slash in /usr/lib was treated as "at BOL" too.
253testing "sed beginning (^) matches only once" \
254 "sed 's,\(^/\|\)[^/][^/]*,>\0<,g'" \
255 ">/usr</>lib<\n" "" \
256 "/usr/lib\n"
257
258testing "sed c" \
259 "sed 'crepl'" \
260 "repl\nrepl\n" "" \
261 "first\nsecond\n"
262
263testing "sed nested {}s" \
264 "sed '/asd/ { p; /s/ { s/s/c/ }; p; q }'" \
265 "qwe\nasd\nacd\nacd\n" "" \
266 "qwe\nasd\nzxc\n"
267
268testing "sed a cmd ended by double backslash" \
269 "sed -e '/| one /a \\
270 | three \\\\' -e '/| one-/a \\
271 | three-* \\\\'" \
272' | one \\
273 | three \\
274 | two \\
275' '' \
276' | one \\
277 | two \\
278'
279
280testing "sed a cmd understands \\n,\\t,\\r" \
281 "sed '/1/a\\\\t\\rzero\\none\\\\ntwo\\\\\\nthree'" \
282"\
283line1
284\t\rzero
285one\\\\ntwo\\
286three
287" "" "line1\n"
288
289testing "sed i cmd understands \\n,\\t,\\r" \
290 "sed '/1/i\\\\t\\rzero\\none\\\\ntwo\\\\\\nthree'" \
291"\
292\t\rzero
293one\\\\ntwo\\
294three
295line1
296" "" "line1\n"
297
298# first three lines are deleted; 4th line is matched and printed by "2,3" and by "4" ranges
299testing "sed with N skipping lines past ranges on next cmds" \
300 "sed -n '1{N;N;d};1p;2,3p;3p;4p'" \
301 "4\n4\n" "" "1\n2\n3\n4\n"
302
303testing "sed -i with address modifies all files, not only first" \
304 "cp input input2; sed -i -e '1s/foo/bar/' input input2 && cat input input2; rm input2" \
305 "bar\nbar\n" "foo\n" ""
306
307testing "sed understands \r" \
308 "sed 's/r/\r/'" \
309 "\rrr\n" "" "rrr\n"
310
311testing "sed -i finishes ranges correctly" \
312 "sed '1,2d' -i input; echo \$?; cat input" \
313 "0\n3\n4\n" "1\n2\n3\n4\n" ""
314
315testing "sed zero chars match/replace advances correctly 1" \
316 "sed 's/l*/@/g'" \
317 "@h@e@o@\n" "" "helllo\n"
318
319testing "sed zero chars match/replace advances correctly 2" \
320 "sed 's [^ .]* x g'" \
321 "x x.x\n" "" " a.b\n"
322
323testing "sed zero chars match/replace logic must not falsely trigger here 1" \
324 "sed 's/a/A/g'" \
325 "_AAA1AA\n" "" "_aaa1aa\n"
326
327testing "sed zero chars match/replace logic must not falsely trigger here 2" \
328 "sed 's/ *$/_/g'" \
329 "qwerty_\n" "" "qwerty\n"
330
331testing "sed /\$_in_regex/ should not match newlines, only end-of-line" \
332 "sed ': testcont; /\\\\$/{ =; N; b testcont }'" \
333 "\
334this is a regular line
3352
336line with \\
337continuation
338more regular lines
3395
340line with \\
341continuation
342" \
343 "" "\
344this is a regular line
345line with \\
346continuation
347more regular lines
348line with \\
349continuation
350"
351
352testing "sed s///NUM test" \
353 "sed -e 's/a/b/2; s/a/c/g'" \
354 "cb\n" "" "aa\n"
355
356testing "sed /regex/,N{...} addresses work" \
357 "sed /^2/,2{d}" \
358 "1\n3\n4\n5\n" \
359 "" \
360 "1\n2\n3\n4\n5\n"
361
362testing "sed /regex/,+N{...} addresses work" \
363 "sed /^2/,+2{d}" \
364 "1\n5\n" \
365 "" \
366 "1\n2\n3\n4\n5\n"
367
368testing "sed /regex/,+N{...} -i works" \
369 "cat - >input2; sed /^4/,+2{d} -i input input2; echo \$?; cat input input2; rm input2" \
370 "0\n""1\n2\n3\n7\n8\n""1\n2\n7\n8\n" \
371 "1\n2\n3\n4\n5\n6\n7\n8\n" \
372 "1\n2\n4\n5\n6\n7\n8\n" \
373
374# GNU sed 4.2.1 would also accept "/^4/,+{d}" with the same meaning, we don't
375testing "sed /regex/,+0{...} -i works" \
376 "cat - >input2; sed /^4/,+0{d} -i input input2; echo \$?; cat input input2; rm input2" \
377 "0\n""1\n2\n3\n5\n6\n7\n8\n""1\n2\n5\n6\n7\n8\n" \
378 "1\n2\n3\n4\n5\n6\n7\n8\n" \
379 "1\n2\n4\n5\n6\n7\n8\n" \
380
381# GNU sed 4.2.1 would also accept "/^4/,+d" with the same meaning, we don't
382testing "sed /regex/,+0<cmd> -i works" \
383 "cat - >input2; sed /^4/,+0d -i input input2; echo \$?; cat input input2; rm input2" \
384 "0\n""1\n2\n3\n5\n6\n7\n8\n""1\n2\n5\n6\n7\n8\n" \
385 "1\n2\n3\n4\n5\n6\n7\n8\n" \
386 "1\n2\n4\n5\n6\n7\n8\n" \
387
388testing "sed 's///w FILE'" \
389 "sed 's/qwe/ZZZ/wz'; cat z; rm z" \
390 "123\nZZZ\nasd\n""ZZZ\n" \
391 "" \
392 "123\nqwe\nasd\n"
393
394# testing "description" "commands" "result" "infile" "stdin"
395
396exit $FAILCOUNT
Note: See TracBrowser for help on using the repository browser.