Using cut with the delimiter flag ("-d") with the "-s" flag to only
output lines containing the delimiter will print blank lines. This is
deviant behavior from cut provided by GNU Coreutils. Blank lines should
be omitted if "-s" is used with "-d".

This change introduces a somewhat naiive, yet efficient solution, where
line length is checked before looping though bytes. If line length is
zero and the "-s" flag is used, the code will jump to parsing the next
line to avoid printing a newline character.

In addition, a test to cut.tests has been added to ensure that this
regression is fixed and will not happen again in the future.

Signed-off-by: Colin McAllister <colinmca...@gmail.com>
---
 coreutils/cut.c     | 6 ++++++
 testsuite/cut.tests | 9 +++++++++
 2 files changed, 15 insertions(+)

diff --git a/coreutils/cut.c b/coreutils/cut.c
index d129f9b9d..8de0c6766 100644
--- a/coreutils/cut.c
+++ b/coreutils/cut.c
@@ -152,6 +152,12 @@ static void cut_file(FILE *file, const char *delim, const 
char *odelim,
                        unsigned uu = 0, start = 0, end = 0, out = 0;
                        int dcount = 0;
 
+                       /* Blank line? */
+                       if (!linelen) {
+                               if (option_mask32 & CUT_OPT_SUPPRESS_FLGS)
+                                       goto next_line;
+                       }
+
                        /* Loop through bytes, finding next delimiter */
                        for (;;) {
                                /* End of current range? */
diff --git a/testsuite/cut.tests b/testsuite/cut.tests
index 2458c019c..0b401bc00 100755
--- a/testsuite/cut.tests
+++ b/testsuite/cut.tests
@@ -65,6 +65,15 @@ testing "cut with -d -f( ) -s" "cut -d' ' -f3 -s input && 
echo yes" "yes\n" "$in
 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" "cut -DF 2,7,5" \
-- 
2.34.1

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to