【问题标题】:grep excluding superstringsgrep 排除超字符串
【发布时间】:2018-10-26 21:22:35
【问题描述】:

我正在尝试使用 git grep 搜索模式,不包括超模式。

我的具体例子是:

git grep 'ad'

但我想排除所有模式,如 "load" 和 'Load' 和 "Thread' 和 'thread(self)' 等。有没有简单的方法可以做到这一点?

【问题讨论】:

  • 使用-w 选项:git grep -w ad
  • 这不应该是@codeforester 的答案吗?

标签: git grep


【解决方案1】:

@codeforester 在 cmets 部分的回答。

git grep -w ad

让我扩展并解释它的含义。

git grep
-w / --word-regexp

匹配模式仅在单词边界(从行首开始,
或前面有一个非单词字符;在行尾结束或后跟非单词字符)。

添加-w 将搜索整个单词而不是它的一部分,这意味着该模式必须匹配整个文本,而不仅仅是它的一部分。


来自 unix grep 手册页:

仅选择那些行,其中包含构成整个单词的匹配项。
测试是匹配的子字符串必须是 在行首,或前面有一个非单词 组成字符。同样,它必须在末尾 行的或后跟非单词组成字符。 构成单词的字符是字母、数字和 下划线。

【讨论】:

  • 我将如何搜索任何包含“oad”但不包含“load”或“toad”的内容?
  • 使用带有所需值的正则表达式
  • 谢谢。您介意提供一个示例,以便 100% 清楚吗?
【解决方案2】:

根据您的进一步要求,如果您仍想匹配某些单词,但不是全部,您可以通过以下一些方式排除一个单词(或单词列表):

全词

如前所述,匹配整个单词将匹配“单词”单元中包含的模式。这些单词单位是字母、数字和下划线。 -w 是这个选项:

git grep -w ad 只会找到单词“ad”的实例,而不是“load”或“toad”等。

反转匹配

另一种选择是将 grep 重新通过管道传递给自身,并使用反向匹配标志。假设您要查找“ad”的实例,以及除“toad”和“load”之外的所有包含“ad”的单词。您可以使用 -v 将 grep 传递到另一个 grep 命令,并使用转义管道 (|) 作为分隔符提供要排除的单词列表:

git grep ad | grep -v "toad\|load"

或者如果您使用的是正则表达式:

git grep ad | grep -ve "toad|load"

如果您仍然想要more 类型的操作,可以将最后一位通过管道传递给more

【讨论】:

    【解决方案3】:

    使用-w 选项让它只搜索单词。这适用于标准 grep 以及大多数类似 grep 的工具。

    【讨论】:

    • 谢谢。但是出于兴趣,我如何才能更一般地排除单词?
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多