match - Match strings against glob paterns
match [-gilrqs] [-n <n>] [-c cmd] [-x code]
{[-p] pattern | -f <file>} str1 [str2 ...]
match checks strings against pattern, which should be a
shell-like glob pattern. pattern may contain the following special
characters:
- ?
- A "?" character in pattern
matches any single character in the string, except that the
"/" character is only matched if match
was given the -s option.
- *
- A "*" character in pattern
matches zero or more characters in the string. The exception is that it
will only match "/" characters if match
was given the -s option.
- [...]
- A set of characters between square brackets matches any character in the
set. In addition, the "-" character can
be used to specify a range. For example
"[+e0-3]" would match any of the
characters "+",
"e", 0,
1, 2, or
3 in the input string. To include a hyphen
("-") in the set of characters matched,
either include the hyphen first or last, or escape it with a
"\".
- [!...]
- A character class preceded by a "!"
matches any character but those specified in the class. The exception is
that the negated character class will match a
"/" only if match was given the
-s option.
- \c
- The backslash character escapes the next character c. Thus, to
match a literal "*", you would use the
pattern "\*".
match prints each string that matches pattern, one per
line, and exits 0 if one or more strings matched. If no string matches,
match exits with status 67 (or whatever alternate status was specified by
the -x flag). If the -n n flag was specified, match
prints only the text that matched the nth occurrence of
"*" in the patten.
OPTIONS
- -f file
- Specifies that the pattern should be read from file. match will
read each line of the file and consider it as pattern to match against the
argument strings. For each argument string, match stops when it hits the
first matching line of the file. If file does not exist, match
exits 67, or whatever code was specified by -x.
- -g
- Normally, the -n option selects text matching particular
"*" characters in the patern. -g
changes this behavior to use parentheses for grouping. Thus, for instance,
the text "foo.c" would match pattern
"*(.[ch])", and the output with option
-n 1 would be ".c". To include a
literal "(" or
")" in the pattern with the -g
option, you must precede the character with a
"\".
- -i
- Makes the match case insensitive. str will be considered to match
if any variation on its capitalization would match. For example, string
"G" would match pattern
"[f-h]".
- -l
- When a pattern matches the string in more than one way, the -l flag
says to assign as much text as possible to the leftmost
"*"s in the pattern. For example,
pattern "*+*" would match text
"a+b+c", and the first
"*" would match
"a+b". This behavior is the default,
thus -l's effect is only to undo a previous -r flag.
- -n n
- With this flag, match prints the text that matched the nth
"*" in the pattern, as opposed to
printing the whole string. The leftmost
"*" corresponds to -n 1.
Specifying -n 0 causes match to print the whole matching string.
Specifying -n -1 or using a value greater than the number of
"*"s in the pattern causes match not to
print anything, in which case you can still use the exit status to see if
there is a match. The default value for n is 0, unless -g
has also been specified, in which case the default is 1.
- -c
command
- When -c is specified, match runs command with the system
shell (/bin/sh), giving it as argument $0
the full string that matched, and as arguments $1,
$2, etc., the parts of the string that matched any
"*"s in pattern. If the command
does not exit with status 0, match will exit immediately, before
processing further matches, with whatever status command returned.
The -c and -n flags are mutually exclusive.
- -p pattern
- Specifies the pattern to match against. The -p flag is optional;
you can specify pattern as the first argument following the
options. However, if you want to try matching the same input string
against multiple patterns, then you must specify each pattern with a
-p flag.
- -q
- This option is synonymous with -n -1; it suppresses output when
there is a match. You can still determine whether a match occurred by the
exit status.
- -r
- When a pattern matches the string in more than one way, the -r flag
says to assign as much text as possible to the rightmost
"*"s in the pattern. For example, with
-r, pattern "*+*" would match
text "a+b+c" with the
"*" matching
"a", and the second matching
"b+c".
- -s
- Ordinarily, "*",
"?", and negated character classes
("[!...]") do not match
"/" characters. -s changes this
behavior to match slashes.
- -x code
- By default, when there is no match, match exits with status 67. With this
option, match exits with status code, instead.
Suppose you have a directory with a bunch of files ending
.c and .o. If, for each file named foo.c you want to
attempt to delete the file foo.o, you can run the following
command:
match -p '*.c' -c 'rm -f $1.o' *.c
Servers running the mailman list manager often send mail from
bounce addresses of the form listname-bounces@host.com. If you
subscribe to multiple lists on the same server, the mailman interface makes
it easier if you subscribe under the same address. To split the mail into
multiple folders based on the bounce address in the environment variable
SENDER, you might chose a mailbox with the following shell code:
name=`match -n1 "*-bounces@host.com" "$SENDER"` \
&& echo "$HOME/Mail/incoming/host-$name.spool"