##
## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##  http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing,
## software distributed under the License is distributed on an
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
## KIND, either express or implied.  See the License for the
## specific language governing permissions and limitations
## under the License.
##

##
## $Rev$ $Date$
##

command.description=Displays lines matching a pattern.

command.argument.pattern=Pattern to match
command.argument.pattern.token=PATTERN

command.argument.path=Path of file to search
command.argument.path.token=PATH

command.option.count=Suppress normal output; instead print a count of matching lines for each input file

command.option.ignoreCase=Ignore case distinctions in both the PATTERN and the input files

command.option.lineNumbers=Prefix each line of output with the line number within its input file

command.option.invertMatch=Invert the sense of matching, to select non-matching lines

command.manual=\
  TODO: grep manual