首页 > 解决方案 > 如何使用`git grep --not`

问题描述

我想git grep为 a 运行一个命令<pattern>,但排除超过 200 个字符的行。

我已经设法通过以下命令实现了这一点:

git grep <pattern> | grep -Ev '.{200}'

如果可能的话,我想把它作为一个命令运行(没有管道)。我以为我可以为此使用git grep --not旗帜,但遇到了困难。

这是我的尝试:

git grep -e <pattern> --not -e '.{200}'

我尝试了上述命令的不同组合,但没有得到想要的输出。

任何关于我下一步应该尝试的指示将不胜感激,在此先感谢您的帮助。


解决方案

(感谢@torek)

git grep -E -e one --and --not -e '.{200}'

标签: gitgrep

解决方案


用于读取的布尔运算符的描述git grep

--and --or
--not ( …​ ) 指定如何使用布尔表达式组合多个模式。是默认运算符。的优先级高于。必须用于所有模式。


--or--and--or-e

你用过:

git grep -e <pattern> --not -e '.{200}'

所以你确实-e为每个模式写了;但是您没有选择--andor之一--or,因此您获得了默认值。哪一个是默认的?(阅读上面引用的文字。)如果您要求匹配某种模式至少不是 200 个字符的内容,是否会选择 12 个字符长的内容它至少不是 200,所以是的,它将被选中。既包含 234 个字符匹配的东西呢?好吧,它匹配,所以是的,它将被选中。唯一会被拒绝的是那些匹配长度为 200 个或更长的内容。

请注意,git grep它本身也默认为基本正则表达式,除非您使用命令行选项或将其配置为使用扩展或 Perl 正则表达式。所以你可能想要-E -e <pattern> --and --not -e '.{200}'这里。另见https://en.wikipedia.org/wiki/Regular_expression


推荐阅读