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
198
199
200
201
202
203
|
#!/bin/sh
# Copyright 2007 by Denys Vlasenko <vda.linux@googlemail.com>
# Licensed under GPLv2, see file LICENSE in this source tree.
. ./testing.sh
# testing "test name" "options" "expected result" "file input" "stdin"
# file input will be file called "input"
# test can create a file "actual" instead of writing to stdout
testing "cut '-' (stdin) and multi file handling" \
"cut -d' ' -f2 - input" \
"over\n""quick\n" \
"the quick brown fox\n" \
"jumps over the lazy dog\n" \
abc="\
one:two:three:four:five:six:seven
alpha:beta:gamma:delta:epsilon:zeta:eta:theta:iota:kappa:lambda:mu
the quick brown fox jumps over the lazy dog
"
testing "cut -b a,a,a" "cut -b 3,3,3 input" "e\np\ne\n" "$abc" ""
testing "cut -b overlaps" \
"cut -b 1-3,2-5,7-9,9-10 input" \
"\
one:to:th
alphabeta
the qick \n" \
"$abc" ""
testing "-b encapsulated" \
"cut -b 3-8,4-6 input" \
"\
e:two:
pha:be
e quic\n" \
"$abc" ""
optional LONG_OPTS
testing "cut -b --output-delimiter overlaps" \
"cut --output-delimiter='^' -b 1-3,2-5,7-9,9-10 input" \
"\
one:t^o:th
alpha^beta
the q^ick \n" \
"$abc" ""
SKIP=
testing "cut high-low error" "cut -b 8-3 input 2>/dev/null || echo err" "err\n" \
"$abc" ""
testing "cut -b 2-1 error" "cut -b 2-1 input 2>/dev/null || echo err" "err\n" \
"$abc" ""
testing "cut -c a-b" "cut -c 4-10 input" ":two:th\nha:beta\n quick \n" "$abc" ""
testing "cut -c a-" "cut -c 41- input" "\ntheta:iota:kappa:lambda:mu\ndog\n" "$abc" ""
testing "cut -c -b" "cut -c -39 input" \
"one:two:three:four:five:six:seven\nalpha:beta:gamma:delta:epsilon:zeta:eta\nthe quick brown fox jumps over the lazy\n" \
"$abc" ""
testing "cut -c a" "cut -c 40 input" "\n:\n \n" "$abc" ""
testing "cut -c a,b-c,d" "cut -c 3,5-7,10 input" "etwoh\npa:ba\nequi \n" "$abc" ""
testing "cut -f a-" "cut -d ':' -f 5- input" "five:six:seven\nepsilon:zeta:eta:theta:iota:kappa:lambda:mu\nthe quick brown fox jumps over the lazy dog\n" "$abc" ""
testing "cut show whole line with no delim" "cut -d ' ' -f 3 input" \
"one:two:three:four:five:six:seven\nalpha:beta:gamma:delta:epsilon:zeta:eta:theta:iota:kappa:lambda:mu\nbrown\n" "$abc" ""
testing "cut with echo, -c (a-b)" "echo 'ref_categorie=test' | cut -c 1-15 " "ref_categorie=t\n" "" ""
testing "cut with echo, -c (a)" "echo 'ref_categorie=test' | cut -c 14" "=\n" "" ""
testing "cut with -c (a,b,c)" "cut -c 4,5,20 input" "det\n" "abcdefghijklmnopqrstuvwxyz" ""
testing "cut with -b (a,b,c)" "cut -b 4,5,20 input" "det\n" "abcdefghijklmnopqrstuvwxyz" ""
input="\
406378:Sales:Itorre:Jan
031762:Marketing:Nasium:Jim
636496:Research:Ancholie:Mel
396082:Sales:Jucacion:Ed
"
testing "cut with -d -f(:) -s" "cut -d: -f3 -s input" "Itorre\nNasium\nAncholie\nJucacion\n" "$input" ""
testing "cut with -d -f( ) -s" "cut -d' ' -f3 -s input && echo yes" "yes\n" "$input" ""
testing "cut with -d -f(a) -s" "cut -da -f3 -s input" "n\nsium:Jim\n\ncion:Ed\n" "$input" ""
testing "cut with -d -f(a) -s -n" "cut -da -f3 -s -n input" "n\nsium:Jim\n\ncion:Ed\n" "$input" ""
input="\
foo bar baz
bing bong boop
"
testing "cut with -d -s omits blank lines" "cut -d' ' -f2 -s input" "bar\nbong\n" "$input" ""
# substitute for awk
optional FEATURE_CUT_REGEX
testing "cut -DF unordered" "cut -DF 2,7,5" \
"\
said and your
are
is demand. supply
forecast :
you you better,
Em: Took hate
" "" \
"Bother, said Pooh. It's your husband, and he has a gun.
Cheerios are donut seeds.
Talk is cheap because supply exceeds demand.
Weather forecast for tonight : dark.
Apple: you can buy better, but you can't pay more.
Subcalifragilisticexpialidocious.
Auntie Em: Hate you, hate Kansas. Took the dog. Dorothy."
# No delimiter found: print entire line regardless of -F RANGES
testing "cut -F1" "cut -d: -F1" \
"the_only_field\n" "" \
"the_only_field\n"
testing "cut -F2" "cut -d: -F2" \
"the_only_field\n" "" \
"the_only_field\n"
# No delimiter found and -s: skip entire line
testing "cut -sF1" "cut -d: -sF1" \
"" "" \
"the_only_field\n"
#^^^ the above is probably mishandled by toybox, it prints the line
testing "cut -sF2" "cut -d: -sF2" \
"" "" \
"the_only_field\n"
# -D disables special handling of lines with no delimiters, the line is treated as the 1st field
testing "cut -DF1" "cut -d: -DF1" \
"the_only_field\n" "" \
"the_only_field\n"
testing "cut -DF2" "cut -d: -DF2" \
"\n" "" \
"the_only_field\n"
optional FEATURE_CUT_REGEX LONG_OPTS
testing "cut -F preserves intermediate delimiters" \
"cut --output-delimiter=: -F2,4-6,7" \
"2:4 5 6:7\n" \
"" "1 2 3 4\t\t5 6 7 8\n"
SKIP=
optional LONG_OPTS
testing "cut -f does not preserve intermediate delimiters" \
"cut --output-delimiter=: -d' ' -f2,4-6,7" \
"2:4:5:6:7\n" \
"" "1 2 3 4 5 6 7 8\n"
SKIP=
testing "cut empty field" "cut -d ':' -f 1-3" \
"a::b\n" \
"" "a::b\n"
testing "cut empty field 2" "cut -d ':' -f 3-5" \
"b::c\n" \
"" "a::b::c:d\n"
testing "cut non-existing field" "cut -d ':' -f1,3" \
"1\n" \
"" "1:\n"
# cut -d$'\n' has a special meaning: "select input lines".
# I didn't find any documentation for this feature.
testing "cut -dNEWLINE" \
"cut -d'
' -f4,2,6-8" \
"2\n4\n6\n7\n" \
"" "1\n2\n3\n4\n5\n6\n7"
optional LONG_OPTS
testing "cut -dNEWLINE --output-delimiter" \
"cut -d'
' --output-delimiter=@@ -f4,2,6-8" \
"2@@4@@6@@7\n" \
"" "1\n2\n3\n4\n5\n6\n7"
testing "cut -dNEWLINE --output-delimiter 2" \
"cut -d'
' --output-delimiter=@@ -f4,2,6-8" \
"2@@4@@6@@7\n" \
"" "1\n2\n3\n4\n5\n6\n7\n"
testing "cut -dNEWLINE --output-delimiter EMPTY_INPUT" \
"cut -d'
' --output-delimiter=@@ -f4,2,6-8" \
"" \
"" ""
SKIP=
# This seems to work as if delimiter is never found.
# We test here that -d '' does *not* operate as if there was no -d
# and delimiter has defaulted to TAB:
testing "cut -d EMPTY" \
"cut -d '' -f2-" \
"1 2\t3 4 5\n" \
"" "1 2\t3 4 5\n"
testing "cut -d EMPTY -s" \
"cut -d '' -f2- -s" \
"" \
"" "1 2\t3 4 5\n"
exit $FAILCOUNT
|