summaryrefslogtreecommitdiff
path: root/src/csplit.c
diff options
context:
space:
mode:
authorAssaf Gordon <assafgordon@gmail.com>2013-03-06 15:53:16 -0500
committerPádraig Brady <P@draigBrady.com>2013-04-10 14:34:52 +0100
commit4114c93af398d7aecb5eb253f90d9b4cc0785643 (patch)
treee12c863d7a3ac08a1abec7c8fc8a4be6991fde9c /src/csplit.c
parentec02161aefab06bec919d10396900ce6fe87390d (diff)
downloadcoreutils-4114c93af398d7aecb5eb253f90d9b4cc0785643.tar.xz
csplit: add the --suppress-matched option
With --suppress-matched, the lines that match the pattern will not be printed in the output files. I.E. the first line from the second and subsequent splits will be suppressed. * src/csplit.c: process_regexp(),process_line_count(): Don't output the matched lines. Since csplit includes "up to but not including" matched lines in each split, the first line (in the next group) is the matched line - so just skip it. main(): Handle new option. usage(): Mention new option. * doc/coreutils.texi (csplit invocation): Mention new option, examples. * tests/misc/csplit-suppress-matched.pl: New test script. * tests/local.mk: Reference the new test. * NEWS: Mention new feature.
Diffstat (limited to 'src/csplit.c')
-rw-r--r--src/csplit.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/csplit.c b/src/csplit.c
index 22f3ad4b1..7a36e6736 100644
--- a/src/csplit.c
+++ b/src/csplit.c
@@ -166,6 +166,9 @@ static bool volatile remove_files;
/* If true, remove all output files which have a zero length. */
static bool elide_empty_files;
+/* If true, suppress the lines that match the PATTERN */
+static bool suppress_matched;
+
/* The compiled pattern arguments, which determine how to split
the input file. */
static struct control *controls;
@@ -176,6 +179,13 @@ static size_t control_used;
/* The set of signals that are caught. */
static sigset_t caught_signals;
+/* For long options that have no equivalent short option, use a
+ non-character as a pseudo short option, starting with CHAR_MAX + 1. */
+enum
+{
+ SUPPRESS_MATCHED_OPTION = CHAR_MAX + 1
+};
+
static struct option const longopts[] =
{
{"digits", required_argument, NULL, 'n'},
@@ -185,6 +195,7 @@ static struct option const longopts[] =
{"elide-empty-files", no_argument, NULL, 'z'},
{"prefix", required_argument, NULL, 'f'},
{"suffix-format", required_argument, NULL, 'b'},
+ {"suppress-matched", no_argument, NULL, SUPPRESS_MATCHED_OPTION},
{GETOPT_HELP_OPTION_DECL},
{GETOPT_VERSION_OPTION_DECL},
{NULL, 0, NULL, 0}
@@ -721,8 +732,13 @@ process_line_count (const struct control *p, uintmax_t repetition)
create_output_file ();
- linenum = get_first_line_in_buffer ();
+ /* Ensure that the line number specified is not 1 greater than
+ the number of lines in the file.
+ When suppressing matched lines, check before the loop. */
+ if (no_more_lines () && suppress_matched)
+ handle_line_error (p, repetition);
+ linenum = get_first_line_in_buffer ();
while (linenum++ < last_line_to_save)
{
line = remove_line ();
@@ -733,9 +749,12 @@ process_line_count (const struct control *p, uintmax_t repetition)
close_output_file ();
+ if (suppress_matched)
+ line = remove_line ();
+
/* Ensure that the line number specified is not 1 greater than
the number of lines in the file. */
- if (no_more_lines ())
+ if (no_more_lines () && !suppress_matched)
handle_line_error (p, repetition);
}
@@ -778,6 +797,9 @@ process_regexp (struct control *p, uintmax_t repetition)
if (!ignore)
create_output_file ();
+ if (suppress_matched && current_line > 0)
+ line = remove_line ();
+
/* If there is no offset for the regular expression, or
it is positive, then it is not necessary to buffer the lines. */
@@ -1324,6 +1346,7 @@ main (int argc, char **argv)
control_used = 0;
suppress_count = false;
remove_files = true;
+ suppress_matched = false;
prefix = DEFAULT_PREFIX;
while ((optc = getopt_long (argc, argv, "f:b:kn:sqz", longopts, NULL)) != -1)
@@ -1357,6 +1380,10 @@ main (int argc, char **argv)
elide_empty_files = true;
break;
+ case SUPPRESS_MATCHED_OPTION:
+ suppress_matched = true;
+ break;
+
case_GETOPT_HELP_CHAR;
case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
@@ -1465,6 +1492,9 @@ and output byte counts of each piece to standard output.\n\
-k, --keep-files do not remove output files on errors\n\
"), stdout);
fputs (_("\
+ -m, --suppress-matched suppress the lines matching PATTERN\n\
+"), stdout);
+ fputs (_("\
-n, --digits=DIGITS use specified number of digits instead of 2\n\
-s, --quiet, --silent do not print counts of output file sizes\n\
-z, --elide-empty-files remove empty output files\n\