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
|
#!/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 "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"
# NOTE: will print 'unfinished c' to stderr and exit 1
testing "c empty continuation" \
"sed -e 'c\\'" "" "" "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 '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 "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 "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 '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'
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"
# You have to match the first line of a range in order to activate
# the range, numeric and ascii work the same way
testing "skip start of range" "sed -e n -e '1,2s/b/c/'" "a\nb\n" "" "a\nb\n"
#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"
# -i with $ last line test
|