Also, the version (from 2.0.21) at http://alexautils.sourceforge.net 
has this feature as --dw, as well as many other convenience 
delimiters, input and output, for all tools that deal with fields.

adj


At 1:25 AM -0700 6/22/02, Ian Bruce wrote:
>As discussed previously on this list
>(http://mail.gnu.org/pipermail/bug-textutils/2002-May/001215.html),
>it would be convenient if cut(1) would accept arbitrary amounts of
>whitespace as a field delimiter. In fact, this is probably what you
>actually want about 90% of the time, although it should not be the
>default behavior for reasons of backward compatibility. The following
>patch accomplishes this. It adds a new option, "-w", which functions
>the same way as the "-f" option, except that it eats all spaces and tabs
>between fields. The "-d" and "-s" options are not allowed in combination
>with "-w".
>
>
>-- Ian Bruce  <ian dot bruce at myrealbox dot com>
>
>
>--- textutils-2.0.21/src/cut.c.orig    Sat Dec  1 09:29:26 2001
>+++ textutils-2.0.21/src/cut.c Tue Jun 18 07:46:45 2002
>@@ -109,8 +109,11 @@
>      /* Output characters that are in the given bytes. */
>      byte_mode,
>
>-    /* Output the given delimeter-separated fields. */
>-    field_mode
>+    /* Output the given delimiter-separated fields. */
>+    field_mode,
>+
>+    /* Output the given whitespace-separated fields. */
>+    field_mode_ws
>    };
>
>  /* The name this program was run with. */
>@@ -118,12 +121,12 @@
>
>  static enum operating_mode operating_mode;
>
>-/* If nonzero do not output lines containing no delimeter characters.
>+/* If nonzero do not output lines containing no delimiter characters.
>     Otherwise, all such lines are printed.  This option is valid only
>     with field mode.  */
>  static int suppress_non_delimited;
>
>-/* The delimeter character for field mode. */
>+/* The delimiter character for field mode. */
>  static int delim;
>
>  /* The length of output_delimiter_string.  */
>@@ -148,6 +151,7 @@
>    {"bytes", required_argument, 0, 'b'},
>    {"characters", required_argument, 0, 'c'},
>    {"fields", required_argument, 0, 'f'},
>+  {"whitespace", required_argument, 0, 'w'},
>    {"delimiter", required_argument, 0, 'd'},
>    {"only-delimited", no_argument, 0, 's'},
>    {"output-delimiter", required_argument, 0, OUTPUT_DELIMITER_OPTION},
>@@ -188,6 +192,7 @@
>  "), stdout);
>        fputs (_("\
>    -s, --only-delimited    do not print lines not containing delimiters\n\
>+  -w, --whitespace=LIST   output only these fields, delimited by 
>whitespace\n\
>        --output-delimiter=STRING  use STRING as the output delimiter\n\
>                              the default is to use the input delimiter\n\
>  "), stdout);
>@@ -195,8 +200,8 @@
>        fputs (VERSION_OPTION_DESCRIPTION, stdout);
>        fputs (_("\
>  \n\
>-Use one, and only one of -b, -c or -f.  Each LIST is made up of one\n\
>-range, or many ranges separated by commas.  Each range is one of:\n\
>+Use one, and only one of -b, -c, -f, or -w.  Each LIST is made up of\n\
>+one range, or many ranges separated by commas.  Each range is one of:\n\
>  \n\
>    N     N'th byte, character or field, counted from 1\n\
>    N-    from N'th byte, character or field, to end of line\n\
>@@ -540,13 +545,78 @@
>      }
>  }
>
>+/* Read from stream STREAM, printing to standard output any selected fields.
>+   Fields are delimited by arbitrary amounts of spaces and tabs.  */
>+
>+static void
>+cut_fields_ws (FILE *stream)
>+{
>+  int c;
>+  int in_field = 0;
>+  int select_field = 0;
>+  unsigned int field_idx = 0;
>+  int found_any_selected_field = 0;
>+
>+  while ((c = getc (stream)) != EOF)
>+    {
>+      if (c == ' ' || c == '\t' || c == '\v')
>+      {
>+        in_field = 0;
>+      }
>+
>+      else if (c == '\n' || c == '\r' || c == '\f')
>+      {
>+        if (found_any_selected_field)
>+          putchar ('\n');
>+        field_idx = 0;
>+        in_field = 0;
>+        found_any_selected_field = 0;
>+      }
>+
>+      else
>+      {
>+        if (in_field)
>+          {
>+            if (select_field)
>+              putchar (c);
>+          }
>+        else
>+          {
>+            if (print_kth (++field_idx))
>+              {
>+                if (found_any_selected_field)
>+                  fwrite (output_delimiter_string, sizeof (char),
>+                          output_delimiter_length, stdout);
>+                putchar (c);
>+                found_any_selected_field = 1;
>+                select_field = 1;
>+              }
>+            else
>+              select_field = 0;
>+            in_field = 1;
>+          }
>+      }
>+    }
>+
>+  if (found_any_selected_field)
>+    putchar ('\n');
>+}
>+
>  static void
>  cut_stream (FILE *stream)
>  {
>-  if (operating_mode == byte_mode)
>-    cut_bytes (stream);
>-  else
>-    cut_fields (stream);
>+  switch (operating_mode)
>+    {
>+    case byte_mode:
>+      cut_bytes (stream);
>+      break;
>+    case field_mode:
>+      cut_fields (stream);
>+      break;
>+    case field_mode_ws:
>+      cut_fields_ws (stream);
>+      break;
>+    }
>  }
>
>  /* Process file FILE to standard output.
>@@ -610,7 +680,7 @@
>    delim = '\0';
>    have_read_stdin = 0;
>
>-  while ((optc = getopt_long (argc, argv, "b:c:d:f:ns", longopts, 
>NULL)) != -1)
>+  while ((optc = getopt_long (argc, argv, "b:c:d:f:w:ns", longopts, 
>NULL)) != -1)
>      {
>        switch (optc)
>       {
>@@ -619,23 +689,35 @@
>
>       case 'b':
>       case 'c':
>-        /* Build the byte list. */
>         if (operating_mode != undefined_mode)
>           FATAL_ERROR (_("only one type of list may be specified"));
>         operating_mode = byte_mode;
>+
>+        /* Build the byte list. */
>         if (set_fields (optarg) == 0)
>           FATAL_ERROR (_("missing list of positions"));
>         break;
>
>       case 'f':
>-        /* Build the field list. */
>         if (operating_mode != undefined_mode)
>           FATAL_ERROR (_("only one type of list may be specified"));
>         operating_mode = field_mode;
>+
>+        /* Build the field list. */
>         if (set_fields (optarg) == 0)
>           FATAL_ERROR (_("missing list of fields"));
>         break;
>
>+      case 'w':
>+        if (operating_mode != undefined_mode)
>+          FATAL_ERROR (_("only one type of list may be specified"));
>+        operating_mode = field_mode_ws;
>+
>+        /* Build the field list. */
>+        if (set_fields (optarg) == 0)
>+          FATAL_ERROR (_("missing list of fields"));
>+        break;   /**/
>+
>       case 'd':
>         /* New delimiter. */
>         /* Interpret -d '' to mean `use the NUL byte as the delimiter.'  */
>@@ -685,7 +767,7 @@
>    if (output_delimiter_string == NULL)
>      {
>        static char dummy[2];
>-      dummy[0] = delim;
>+      dummy[0] = (operating_mode == field_mode_ws ? ' ' : delim);
>        dummy[1] = '\0';
>        output_delimiter_string = dummy;
>        output_delimiter_length = 1;
>
>_______________________________________________
>Bug-textutils mailing list
>[EMAIL PROTECTED]
>http://mail.gnu.org/mailman/listinfo/bug-textutils


_______________________________________________
Bug-textutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-textutils

Reply via email to