在尝试grep一个包含点的字符串时,我无法得到精确匹配的字符串输出。
例如:grep "APPLICATION.REFERENCE.LOCAL" <FILENAME>
我甚至尝试过:
grep -F 'APPLICATION.REFERENCE.LOCAL' <FILENAME>
,但它也会显示类似匹配项APPLICATION.REFERENCE.LOCAL1
的行。
请帮助我。
由于你使用了-F
,这会将模式解释为一个固定的字符串,因此你需要提供-x
选项来精确匹配整行。
grep -Fx 'APPLICATION.REFERENCE.LOCAL' filename
man grep
的说明:
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
-x, --line-regexp
Select only those matches that exactly match the whole line.
(-x is specified by POSIX.)
例子:
$ cat file
APPLICATION.REFERENCE.LOCAL
1APPLICATION.REFERENCE.LOCAL
APPLICATION.REFERENCE.LOCAL1
APPLICATION.REFERENCE0LOCAL
$ grep -Fx 'APPLICATION.REFERENCE.LOCAL' file
APPLICATION.REFERENCE.LOCAL
-F
,所以 ^
和 $
锚点将被解释为字面值。-x
匹配整行。 - devnull-F
并加入了锚点和转义的.
。而你则采取了另一种方式。我的回答更普遍地解决了“当字符串中有一个点时,如何使用正则表达式匹配”的问题;而你的回答则更清晰地回答了具体示例。我认为两者都对讨论有所贡献,这也是我为什么给你的回答点赞的原因。 - Floris您需要使用反斜杠来转义点号:
grep 'APPLICATION\.REFERENCE\.LOCAL'
如果你想在一行中仅匹配 "only and exactly this",则需要使用 "字符串开头和结尾" 字符进行锚定:
grep '^APPLICATION\.REFERENCE\.LOCAL$'
-w
。因此,grep -Fw string file
。grep -E (^|[^A-Z])APPLICATION\.REFERENCE\.LOCAL([^A-Z]|$)' file
grep
,则不一定需要使用grep -E
,但它更简单且可在POSIX上移植。 - tripleee
grep
的工作方式。(在病态情况下,如何正确引用正则表达式可能因shell而异,但是在这里您只需要简单直接地引用即可。) - tripleee