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