Thanks for pointing out the problem. That patch is large enough to
require papers. Rather than hassling with that, I went to the source and
derived the attached patch independently, and installed it. I hope I
caught everything you did; if not please let us know (and perhaps it's
time to get papers from you for Grep too....).
>From 2ff0ebc82a12bc2df19500260a1d53b7f228fdcb Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Fri, 11 May 2018 08:30:12 -0700
Subject: [PATCH] =?UTF-8?q?doc:=20=E2=80=9Cpattern=E2=80=9D=20vs=20?=
=?UTF-8?q?=E2=80=9Cpatterns=E2=80=9D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* doc/grep.in.1, doc/grep.texi, src/grep.c (usage): Be more
careful about saying that an argument or option specifies one or
more patterns, not just a single pattern. Problem reported by Kaz
Kylheku (Bug#31400).
---
doc/grep.in.1 | 71 +++++++++++++++++++++++++++------------------------
doc/grep.texi | 57 ++++++++++++++++++++---------------------
src/grep.c | 32 +++++++++++------------
3 files changed, 81 insertions(+), 79 deletions(-)
diff --git a/doc/grep.in.1 b/doc/grep.in.1
index e260085..9d0d494 100644
--- a/doc/grep.in.1
+++ b/doc/grep.in.1
@@ -2,7 +2,7 @@
.de dT
.ds Dt \\$2
..
-.dT Time-stamp: "2018-04-21"
+.dT Time-stamp: "2018-05-11"
.\" Update the above date whenever a change to either this file or
.\" grep.c's 'usage' function results in a nontrivial change to the man page.
.\" In Emacs, you can update the date by running 'M-x time-stamp'
@@ -137,34 +137,39 @@
.hy 0
.
.SH NAME
-grep, egrep, fgrep \- print lines matching a pattern
+grep, egrep, fgrep \- print lines that match patterns
.
.SH SYNOPSIS
.B grep
-.RI [ OPTIONS ]
-.I PATTERN
+.RI [ OPTION .\|.\|.]\&
+.I PATTERNS
.RI [ FILE .\|.\|.]
.br
.B grep
-.RI [ OPTIONS ]
+.RI [ OPTION .\|.\|.]\&
.B \-e
-.I PATTERN
+.I PATTERNS
\&.\|.\|.\&
.RI [ FILE .\|.\|.]
.br
.B grep
-.RI [ OPTIONS ]
+.RI [ OPTION .\|.\|.]\&
.B \-f
-.I FILE
+.I PATTERN_FILE
\&.\|.\|.\&
.RI [ FILE .\|.\|.]
.
.SH DESCRIPTION
.B grep
searches for
-.I PATTERN
+.I PATTERNS
in each
.IR FILE .
+.I PATTERNS
+is one or patterns separated by newline characters, and
+.B grep
+prints each line that matches a pattern.
+.PP
A
.I FILE
of
@@ -174,9 +179,6 @@ If no
.I FILE
is given, recursive searches examine the working directory,
and nonrecursive searches read standard input.
-By default,
-.B grep
-prints the matching lines.
.PP
In addition, the variant programs
.B egrep
@@ -203,36 +205,37 @@ and exit.
.TP
.BR \-E ", " \-\^\-extended\-regexp
Interpret
-.I PATTERN
-as an extended regular expression (ERE, see below).
+.I PATTERNS
+as extended regular expressions (EREs, see below).
.TP
.BR \-F ", " \-\^\-fixed\-strings
Interpret
-.I PATTERN
-as a list of fixed strings (instead of regular expressions),
-separated by newlines,
-any of which is to be matched.
+.I PATTERNS
+as fixed strings, not regular expressions.
.TP
.BR \-G ", " \-\^\-basic\-regexp
Interpret
-.I PATTERN
-as a basic regular expression (BRE, see below).
+.I PATTERNS
+as basic regular expressions (BREs, see below).
This is the default.
.TP
.BR \-P ", " \-\^\-perl\-regexp
-Interpret the pattern as a Perl-compatible regular expression (PCRE).
-This is experimental and
+Interpret PATTERNS as Perl-compatible regular expressions (PCREs).
+This option is experimental when combined with the
+.B \-z
+.RB ( \-\^\-null\-data )
+option, and
.B "grep \-P"
may warn of unimplemented features.
.SS "Matching Control"
.TP
-.BI \-e " PATTERN" "\fR,\fP \-\^\-regexp=" PATTERN
+.BI \-e " PATTERNS" "\fR,\fP \-\^\-regexp=" PATTERNS
Use
-.I PATTERN
-as the pattern.
+.I PATTERNS
+as the patterns.
If this option is used multiple times or is combined with the
.B \-f
-.RB ( \-\-file )
+.RB ( \-\^\-file )
option, search for all patterns given.
This option can be used to protect a pattern beginning with \*(lq\-\*(rq.
.TP
@@ -242,7 +245,7 @@ Obtain patterns from
one per line.
If this option is used multiple times or is combined with the
.B \-e
-.RB ( \-\-regexp )
+.RB ( \-\^\-regexp )
option, search for all patterns given.
The empty file contains zero patterns, and therefore matches nothing.
.TP
@@ -389,7 +392,7 @@ Display input actually coming from standard input as input coming from file
This is especially useful when implementing tools like
.BR zgrep ,
e.g.,
-.BR "gzip -cd foo.gz | grep --label=foo -H something" .
+.BR "gzip \-cd foo.gz | grep \-\^\-label=foo \-H something" .
See also the
.B \-H
option.
@@ -511,7 +514,7 @@ matches, or no message if there is no match.
If
.I TYPE
is
-.BR without-match ,
+.BR without\-match ,
when
.B grep
discovers that a file is binary it assumes that the rest of the file
@@ -635,13 +638,13 @@ as wildcards, and
.B \e
to quote a wildcard or backslash character literally.
.TP
-.BI \-\^\-exclude-from= FILE
+.BI \-\^\-exclude\-from= FILE
Skip files whose base name matches any of the file-name globs read from
.I FILE
(using wildcard matching as described under
.BR \-\^\-exclude ).
.TP
-.BI \-\^\-exclude-dir= GLOB
+.BI \-\^\-exclude\-dir= GLOB
Skip any command-line directory with a name suffix that matches the
pattern
.IR GLOB .
@@ -654,7 +657,7 @@ Ignore any redundant trailing slashes in
.BR \-I
Process a binary file as if it did not contain matching data; this is
equivalent to the
-.B \-\^\-binary\-files=without-match
+.B \-\^\-binary\-files=without\-match
option.
.TP
.BI \-\^\-include= GLOB
@@ -987,10 +990,10 @@ have priority over it.
It can only specify the color used to highlight
the matching non-empty text in any matching line
(a selected line when the
-.B -v
+.B \-v
command-line option is omitted,
or a context line when
-.B -v
+.B \-v
is specified).
The default is
.BR 01;31 ,
diff --git a/doc/grep.texi b/doc/grep.texi
index 872ba07..1b37c98 100644
--- a/doc/grep.texi
+++ b/doc/grep.texi
@@ -33,11 +33,11 @@ Texts. A copy of the license is included in the section entitled
@dircategory Text creation and manipulation
@direntry
-* grep: (grep). Print lines matching a pattern.
+* grep: (grep). Print lines that match patterns.
@end direntry
@titlepage
-@title GNU Grep: Print lines matching a pattern
+@title GNU Grep: Print lines that match patterns
@subtitle version @value{VERSION}, @value{UPDATED}
@author Alain Magloire et al.
@page
@@ -52,7 +52,7 @@ Texts. A copy of the license is included in the section entitled
@node Top
@top grep
-@command{grep} prints lines that contain a match for a pattern.
+@command{grep} prints lines that contain a match for one or more patterns.
This manual is for version @value{VERSION} of GNU Grep.
@@ -74,10 +74,10 @@ This manual is for version @value{VERSION} of GNU Grep.
@node Introduction
@chapter Introduction
-@cindex searching for a pattern
+@cindex searching for patterns
-@command{grep} searches input files
-for lines containing a match to a given pattern list.
+Given one or more patterns, @command{grep} searches input files
+for matches to the patterns.
When it finds a match in a line,
it copies the line to standard output (by default),
or produces whatever other sort of output you have requested with options.
@@ -97,17 +97,16 @@ there is no way to match newline characters in a text.
The general synopsis of the @command{grep} command line is
@example
-grep @var{options} @var{pattern} @var{input_file_names}
+grep [@var{option}...] [@var{patterns}] [@var{file}...]
@end example
@noindent
-There can be zero or more @var{options}.
-@var{pattern} will only be seen as such
-(and not as an @var{input_file_name})
-if it wasn't already specified within @var{options}
-(by using the @samp{-e@ @var{pattern}}
-or @samp{-f@ @var{file}} options).
-There can be zero or more @var{input_file_names}.
+
+There can be zero or more @var{option} arguments, and zero or more
+@var{file} arguments. The @var{patterns} argument contains one or
+more patterns separated by newlines, and is omitted when patterns are
+given via the @samp{-e@ @var{patterns}} or @samp{-f@ @var{file}}
+options.
@menu
* Command-line Options:: Short and long names, grouped by category.
@@ -170,12 +169,13 @@ This version number should be included in all bug reports.
@table @option
-@item -e @var{pattern}
-@itemx --regexp=@var{pattern}
+@item -e @var{patterns}
+@itemx --regexp=@var{patterns}
@opindex -e
-@opindex --regexp=@var{pattern}
-@cindex pattern list
-Use @var{pattern} as the pattern.
+@opindex --regexp=@var{patterns}
+@cindex patterns option
+Use @var{patterns} as one or more patterns; newlines within
+@var{patterns} separate each pattern from the next.
If this option is used multiple times or is combined with the
@option{-f} (@option{--file}) option, search for all patterns given.
(@option{-e} is specified by POSIX.)
@@ -184,7 +184,7 @@ If this option is used multiple times or is combined with the
@itemx --file=@var{file}
@opindex -f
@opindex --file
-@cindex pattern from file
+@cindex patterns from file
Obtain patterns from @var{file}, one per line.
If this option is used multiple times or is combined with the
@option{-e} (@option{--regexp}) option, search for all patterns given.
@@ -240,7 +240,7 @@ This option has no effect if @option{-x} is also specified.
Because the @option{-w} option can match a substring that does not
begin and end with word constituents, it differs from surrounding a
-pattern with @samp{\<} and @samp{\>}. For example, although
+regular expression with @samp{\<} and @samp{\>}. For example, although
@samp{grep -w @@} matches a line containing only @samp{@@}, @samp{grep
'\<@@\>'} cannot match any line because @samp{@@} is not a
word constituent. @xref{The Backslash Character and Special
@@ -252,7 +252,7 @@ Expressions}.
@opindex --line-regexp
@cindex match the whole line
Select only those matches that exactly match the whole line.
-For a regular expression pattern, this is like parenthesizing the
+For regular expression patterns, this is like parenthesizing each
pattern and then surrounding it with @samp{^} and @samp{$}.
(@option{-x} is specified by POSIX.)
@@ -1103,7 +1103,7 @@ greater than 2 on error.
@cindex variants of @command{grep}
@command{grep} searches the named input files
-for lines containing a match to the given pattern.
+for lines containing a match to the given patterns.
By default, @command{grep} prints the matching lines.
A file named @file{-} stands for standard input.
If no input is specified, @command{grep} searches the working
@@ -1119,7 +1119,7 @@ controlled by the following options.
@opindex -G
@opindex --basic-regexp
@cindex matching basic regular expressions
-Interpret the pattern as a basic regular expression (BRE).
+Interpret patterns as basic regular expressions (BREs).
This is the default.
@item -E
@@ -1127,7 +1127,7 @@ This is the default.
@opindex -E
@opindex --extended-regexp
@cindex matching extended regular expressions
-Interpret the pattern as an extended regular expression (ERE).
+Interpret patterns as extended regular expressions (EREs).
(@option{-E} is specified by POSIX.)
@item -F
@@ -1135,8 +1135,7 @@ Interpret the pattern as an extended regular expression (ERE).
@opindex -F
@opindex --fixed-strings
@cindex matching fixed strings
-Interpret the pattern as a list of fixed strings (instead of regular
-expressions), separated by newlines, any of which is to be matched.
+Interpret patterns as fixed strings, not regular expressions.
(@option{-F} is specified by POSIX.)
@item -P
@@ -1144,7 +1143,7 @@ expressions), separated by newlines, any of which is to be matched.
@opindex -P
@opindex --perl-regexp
@cindex matching Perl-compatible regular expressions
-Interpret the pattern as a Perl-compatible regular expression (PCRE).
+Interpret patterns as Perl-compatible regular expressions (PCREs).
PCRE support is here to stay, but consider this option experimental when
combined with the @option{-z} (@option{--null-data}) option, and note that
@samp{grep@ -P} may warn of unimplemented features.
@@ -1846,7 +1845,7 @@ Aho--Corasick algorithm is used to match multiple fixed patterns.
@cindex locales
Generally speaking @command{grep} operates more efficiently in
single-byte locales, since it can avoid the special processing needed
-for multi-byte characters. If your pattern will work just as well
+for multi-byte characters. If your patterns will work just as well
that way, setting @env{LC_ALL} to a single-byte locale can help
performance considerably. Setting @samp{LC_ALL='C'} can be
particularly efficient, as @command{grep} is tuned for that locale.
diff --git a/src/grep.c b/src/grep.c
index 6754e4e..f4ae5f5 100644
--- a/src/grep.c
+++ b/src/grep.c
@@ -1905,31 +1905,32 @@ usage (int status)
{
if (status != 0)
{
- fprintf (stderr, _("Usage: %s [OPTION]... PATTERN [FILE]...\n"),
+ fprintf (stderr, _("Usage: %s [OPTION]... PATTERNS [FILE]...\n"),
getprogname ());
fprintf (stderr, _("Try '%s --help' for more information.\n"),
getprogname ());
}
else
{
- printf (_("Usage: %s [OPTION]... PATTERN [FILE]...\n"), getprogname ());
- printf (_("Search for PATTERN in each FILE.\n"));
+ printf (_("Usage: %s [OPTION]... PATTERNS [FILE]...\n"), getprogname ());
+ printf (_("Search for PATTERNS in each FILE.\n"));
printf (_("\
Example: %s -i 'hello world' menu.h main.c\n\
+PATTERNS can contain multiple patterns separated by newlines.\n\
\n\
Pattern selection and interpretation:\n"), getprogname ());
printf (_("\
- -E, --extended-regexp PATTERN is an extended regular expression\n\
- -F, --fixed-strings PATTERN is a set of newline-separated strings\n\
- -G, --basic-regexp PATTERN is a basic regular expression (default)\n\
- -P, --perl-regexp PATTERN is a Perl regular expression\n"));
+ -E, --extended-regexp PATTERNS are extended regular expressions\n\
+ -F, --fixed-strings PATTERNS are strings\n\
+ -G, --basic-regexp PATTERNS are basic regular expressions\n\
+ -P, --perl-regexp PATTERNS are Perl regular expressions\n"));
/* -X is deliberately undocumented. */
printf (_("\
- -e, --regexp=PATTERN use PATTERN for matching\n\
- -f, --file=FILE obtain PATTERN from FILE\n\
+ -e, --regexp=PATTERNS use PATTERNS for matching\n\
+ -f, --file=FILE take PATTERNS from FILE\n\
-i, --ignore-case ignore case distinctions\n\
- -w, --word-regexp force PATTERN to match only whole words\n\
- -x, --line-regexp force PATTERN to match only whole lines\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"));
printf (_("\
\n\
@@ -1950,7 +1951,7 @@ Output control:\n\
--label=LABEL use LABEL as the standard input file name prefix\n\
"));
printf (_("\
- -o, --only-matching show only nonempty parts of lines matching PATTERN\n\
+ -o, --only-matching show only nonempty parts of lines that match\n\
-q, --quiet, --silent suppress all normal output\n\
--binary-files=TYPE assume that binary files are TYPE;\n\
TYPE is 'binary', 'text', or 'without-match'\n\
@@ -1966,11 +1967,10 @@ Output control:\n\
-R, --dereference-recursive likewise, but follow all symlinks\n\
"));
printf (_("\
- --include=FILE_PATTERN search only files that match FILE_PATTERN\n\
- --exclude=FILE_PATTERN skip files and directories matching\
- FILE_PATTERN\n\
+ --include=GLOB search only files that match GLOB (a file pattern)\n\
+ --exclude=GLOB skip files and directories matching GLOB\n\
--exclude-from=FILE skip files matching any file pattern from FILE\n\
- --exclude-dir=PATTERN directories that match PATTERN will be skipped.\n\
+ --exclude-dir=GLOB skip directories that match GLOB\n\
"));
printf (_("\
-L, --files-without-match print only names of FILEs with no selected lines\n\
--
2.17.0