On 10/24/19 1:40 PM, arn...@skeeve.com wrote:

I chose '-g' since that letter was unused. It has no mnemonic value.

Thanks for implementing that. Other grep-like programs tend to use -I for this option, since it negates -i. Obviously we can't do that right now since -I means --binary-files=without-match to GNU grep. So I installed the attached, which takes the more-conservative approach of implementing just --no-ignore-case without any single-letter option. Perhaps in the future we could deprecate -I and then eventually repurpose it? But in the meantime this particular feature request is done, so I'm taking the liberty of closing the bug report.
>From d3a7315d770897dfb3cd826f399d822b1b771d0b Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Tue, 5 Nov 2019 15:32:58 -0800
Subject: [PATCH] grep: new --no-ignore-case option

Suggested by Karl Berry and mostly implemented by Arnold Robbins
(Bug#37907).
* NEWS:
* doc/grep.in.1:
* doc/grep.texi (Matching Control):
* src/grep.c (usage):
Document the new option.
* src/grep.c (NO_IGNORE_CASE_OPTION): New constant.
(long_options, main): Support new option.
---
 NEWS          | 5 +++++
 doc/grep.in.1 | 9 ++++++++-
 doc/grep.texi | 7 +++++++
 src/grep.c    | 9 ++++++++-
 4 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/NEWS b/NEWS
index 9ce65b3..c31c600 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,11 @@ GNU grep NEWS                                    -*- outline -*-
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+** New features
+
+  The new --no-ignore-case option causes grep to observe case
+  distinctions, overriding any previous -i (--ignore-case) option.
+
 ** Bug fixes
 
   The exit status of 'grep -L' is no longer incorrect when standard
diff --git a/doc/grep.in.1 b/doc/grep.in.1
index a2cbf5c..219f37f 100644
--- a/doc/grep.in.1
+++ b/doc/grep.in.1
@@ -254,6 +254,13 @@ Ignore case distinctions in patterns and input data,
 so that characters that differ only in case
 match each other.
 .TP
+.B \-\^\-no\-ignore\-case
+Do not ignore case distinctions in patterns and input data.
+This is the default.
+This option is useful for passing to shell scripts that already use
+.BR \-i ,
+to cancel its effects because the two options override each other.
+.TP
 .BR \-v ", " \-\^\-invert\-match
 Invert the sense of matching, to select non-matching lines.
 .TP
@@ -683,7 +690,7 @@ Follow all symbolic links, unlike
 .BR \-r .
 .SS "Other Options"
 .TP
-.BR \-\^\-line\-buffered
+.B \-\^\-line\-buffered
 Use line buffering on output.
 This can cause a performance penalty.
 .TP
diff --git a/doc/grep.texi b/doc/grep.texi
index f5edc72..01ad5f7 100644
--- a/doc/grep.texi
+++ b/doc/grep.texi
@@ -215,6 +215,13 @@ SHARP S) even though lowercasing the latter yields the former.
 @option{-y} is an obsolete synonym that is provided for compatibility.
 (@option{-i} is specified by POSIX.)
 
+@item --no-ignore-case
+@opindex --no-ignore-case
+Do not ignore case distinctions in patterns and input data.  This is
+the default.  This option is useful for passing to shell scripts that
+already use @option{-i}, in order to cancel its effects because the
+two options override each other.
+
 @item -v
 @itemx --invert-match
 @opindex -v
diff --git a/src/grep.c b/src/grep.c
index 7f3ada1..edf90ab 100644
--- a/src/grep.c
+++ b/src/grep.c
@@ -424,7 +424,8 @@ enum
   GROUP_SEPARATOR_OPTION,
   INCLUDE_OPTION,
   LINE_BUFFERED_OPTION,
-  LABEL_OPTION
+  LABEL_OPTION,
+  NO_IGNORE_CASE_OPTION
 };
 
 /* Long options equivalences. */
@@ -455,6 +456,7 @@ static struct option const long_options[] =
   {"help", no_argument, &show_help, 1},
   {"include", required_argument, NULL, INCLUDE_OPTION},
   {"ignore-case", no_argument, NULL, 'i'},
+  {"no-ignore-case", no_argument, NULL, NO_IGNORE_CASE_OPTION},
   {"initial-tab", no_argument, NULL, 'T'},
   {"label", required_argument, NULL, LABEL_OPTION},
   {"line-buffered", no_argument, NULL, LINE_BUFFERED_OPTION},
@@ -1927,6 +1929,7 @@ Pattern selection and interpretation:\n"), getprogname ());
   -e, --regexp=PATTERNS     use PATTERNS for matching\n\
   -f, --file=FILE           take PATTERNS from FILE\n\
   -i, --ignore-case         ignore case distinctions in patterns and data\n\
+      --no-ignore-case      do not ignore case distinctions (default)\n\
   -w, --word-regexp         match only whole words\n\
   -x, --line-regexp         match only whole lines\n\
   -z, --null-data           a data line ends in 0 byte, not newline\n"));
@@ -2617,6 +2620,10 @@ main (int argc, char **argv)
         match_icase = true;
         break;
 
+      case NO_IGNORE_CASE_OPTION:
+        match_icase = false;
+        break;
+
       case 'L':
         /* Like -l, except list files that don't contain matches.
            Inspired by the same option in Hume's gre. */
-- 
2.23.0

Reply via email to