如何使用`git grep --not`命令?

6

我想要运行一个git grep命令去查找一个<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}'
2个回答

6

git grep的布尔运算符说明如下:

--and
--or
--not
( …​ )
使用布尔表达式指定多个模式的组合方式,--or是默认操作符。--and--or具有更高的优先级。所有模式都必须使用-e

您使用了:

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

你为每个模式都写了-e,但没有选择--and--or中的一个,所以你得到了默认值。哪个是默认值?(请阅读上面引用的文本。)如果你要求匹配某些模式或不少于200个字符,那么长度为12个字符的东西会被选择吗?它不足200,所以是的,它会被选择。那么对于既有234个字符又匹配的东西呢?好吧,它匹配,所以是的,它会被选择。唯一被拒绝的是既不匹配又长达200个字符或更长的东西。请注意,git grep本身也默认使用基本正则表达式,除非您使用命令行选项或配置它使用扩展或Perl正则表达式。所以你可能想在这里使用-E -e <pattern> --and --not -e '.{200}'。另请参见https://en.wikipedia.org/wiki/Regular_expression

非常棒的答案,解释详细,谢谢 :) - Sam Houston

2
你也可以使用awk来解决这个问题。 awk '/<pattern>/ && length($2) < 200'

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