如何在ksh中使用grep精确匹配带有点的字符串?

3

在尝试grep一个包含点的字符串时,我无法得到精确匹配的字符串输出。

例如:grep "APPLICATION.REFERENCE.LOCAL" <FILENAME>

我甚至尝试过:

grep -F 'APPLICATION.REFERENCE.LOCAL' <FILENAME>,但它也会显示类似匹配项APPLICATION.REFERENCE.LOCAL1的行。

请帮助我。


1
就此而言,您使用哪个shell并不影响grep的工作方式。(在病态情况下,如何正确引用正则表达式可能因shell而异,但是在这里您只需要简单直接地引用即可。) - tripleee
3个回答

7

由于你使用了-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

1
我喜欢在这种情况下使用“-Fx”。 - Floris
@Floris 由于 OP 使用了 -F,所以 ^$ 锚点将被解释为字面值。-x 匹配整行。 - devnull
这就是为什么在我的回答中,我去掉了-F并加入了锚点和转义的.。而你则采取了另一种方式。我的回答更普遍地解决了“当字符串中有一个点时,如何使用正则表达式匹配”的问题;而你的回答则更清晰地回答了具体示例。我认为两者都对讨论有所贡献,这也是我为什么给你的回答点赞的原因。 - Floris
@Floris 是的,我完全同意。你的教育我们如何使用锚点和转义元字符。 - devnull

6

您需要使用反斜杠来转义点号:

grep 'APPLICATION\.REFERENCE\.LOCAL'

如果你想在一行中仅匹配 "only and exactly this",则需要使用 "字符串开头和结尾" 字符进行锚定:

grep '^APPLICATION\.REFERENCE\.LOCAL$'

1
如果您希望限制匹配单词边界,可以添加-w。因此,grep -Fw string file
如果“单词边界”的定义对您来说太宽松,您需要在正则表达式中指定边界。可能是这样的东西:
grep -E (^|[^A-Z])APPLICATION\.REFERENCE\.LOCAL([^A-Z]|$)' file

只会找到以行首/行尾或非大写字母字符为边界的匹配项。

1
如果您使用GNU grep,则不一定需要使用grep -E,但它更简单且可在POSIX上移植。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接