我需要搜索包含某些单词但不包含第二个单词的行。

例如,查找包含单词“ This”但不包含单词“ red”的行

,这样对于包含这些行的文件

This is a blue coat
This is a red  coat
This is a purple coat
That is a coat


搜索将仅找到第一行和第三行。

感谢任何建议!

评论

您可以使用与较新的Vims一起分发的LogiPat插件

#1 楼

还有另一种使用:global命令的方法,如下所示:显示不包含:g的行,最后将This:v的缩写)应用于具有匹配项的那些行。

这是vim的魅力。

评论


感谢@TroyDaniel,您能解释一下\ C做什么吗?

– Leo Simon
20/05/17在16:07



在vim中,正则表达式中的\ C表示区分大小写,而\ c(带有较低的c)表示不区分大小写。有关更多详细信息,您可以:h \ C。

–特洛伊·丹尼尔(Troy Daniel)
20 May 17 '17:35

感谢@TroyDaniel,数十年来,我一直想知道如何进行不区分大小写的搜索!但是您的建议包括红色,而不是排除红色,因此仅返回第二行。您能否修改答案以排除红色?我尝试使用上面的@语法,但无法在您的设置中正常工作

– Leo Simon
20-05-17在18:04

只要您知道:g命令,您就应该知道:g!或:v命令。如果没有,请执行:hv。

–特洛伊·丹尼尔(Troy Daniel)
20-05-18在13:47

注意:这至少需要Vim 8.0.630。在旧版本中不允许递归使用:g

–克里斯蒂安·布拉班德(Christian Brabandt)
20-05-19在8:14

#2 楼

您可以使用此命令来打印包含This而不是red的行:满足两个条件(分支)的行,

\&是第一个分支,它可以简单地是AND,但是这样更通用,

\(.*This\)是第二个分支分支This的意思是“如果前面的原子不匹配,则零宽度匹配”,就像逻辑\(.*red\)\@!一样。

换句话说:

:g/\(.*This\)\&\(.*red\)\@!


评论


非常感谢,这非常像通过格式化文本进行查询。我能够使用它来查找缺少文档字符串的函数。

–约书亚·德特维尔(Joshua Detwiler)
18年7月23日在17:14

#3 楼

看看这篇文章。

用@romainl答案将其组合起来,您可以做任何您想做的事情。 const到没有它们的函数。

    handleChange = value => {


VIM脚本:

%s/\([ ]*\)\(\w* = .*$\)\&^\(\&\(.*const.*\)\@!.\)*$/const /gc


输出:

    const handleChange = value => {


解释:

\([ ]*\)\(\w* = .*$\)


-让我将所有具有word =的行

\&


-合并规则

^\(\&\(.*const.*\)\@!.\)*$


-该行不应包含const