【问题标题】:how to grep exact match of a string with dots in it in a ksh如何在ksh中grep精确匹配带有点的字符串
【发布时间】:2013-11-12 08:01:58
【问题描述】:

在尝试 grep 查找其中包含点的字符串时,我无法获得完全匹配的字符串作为输出。

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

我什至尝试过:

grep -F 'APPLICATION.REFERENCE.LOCAL' <FILENAME> 还显示具有类似匹配项的行,例如 APPLICATION.REFERENCE.LOCAL1

请帮帮我。

【问题讨论】:

  • 对于它的价值,您使用哪个 shell 不会影响 grep 的工作方式。 (在病态的情况下,如何正确引用正则表达式可能会因 shell 而异,但您可以在这里简单直接地引用。)

标签: regex grep


【解决方案1】:

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

【讨论】:

  • 我喜欢为此目的使用-Fx
  • @Floris 由于 OP 使用了 -F^$ 锚点将被解释为文字。 -x 匹配整行。
  • 这就是为什么,在我的回答中,我取出了 -F 并放入了锚点并逃脱了 . 。你走了另一条路。我的回答更笼统地解决了“当我想匹配的字符串中有一个点时如何使用正则表达式”;你的答案是对给出的具体例子的更清晰的回答。我认为,两者都为讨论增添了一些内容。这就是为什么我赞成你的回答。
  • @Floris 是的,我完全同意。你的教育关于锚点和转义元字符。
【解决方案2】:

你需要用反斜杠转义点:

grep 'APPLICATION\.REFERENCE\.LOCAL'

如果你想在行中“只和完全一样”,你需要用“字符串的开始和结束”字符来锚定:

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

【讨论】:

    【解决方案3】:

    如果您希望在单词边界处限制匹配,请添加 -w。所以grep -Fw string file

    如果“单词边界”的定义对您来说过于宽松,您需要在正则表达式中指定边界。可能是这样的:

    grep -E (^|[^A-Z])APPLICATION\.REFERENCE\.LOCAL([^A-Z]|$)' file
    

    只会找到以行首/行尾为界的匹配项,或者不是大写字母的字符。

    【讨论】:

    • 如果你有 GNU grepgrep -E 的使用并不是绝对必要的,但它更简单且可跨 POSIX 移植。
    猜你喜欢
    • 2015-04-13
    • 2019-11-03
    • 2021-10-18
    • 1970-01-01
    • 2022-11-26
    相关资源
    最近更新 更多