搜索包含模式但不包含第二个模式的行


15

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

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

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

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

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

感谢您的任何建议!


您可以使用随Vims发行的LogiPat插件
Christian Brabandt

Answers:


23

您可以使用此命令来打印包含This和不包含的行red

:g/\(.*This\)\&\(.*red\)\@!
  • \&将分支像逻辑上一样分开,AND因为我们希望满足两个条件的线(分支),
  • \(.*This\)是第一个分支,可能只是一个分支,This但是这样更通用
  • \(.*red\)\@!是第二个分支,\@!表示“如果前面的原子不匹配,则零宽度匹配”,如逻辑NOT

换一种说法:

\(.*This\)  \&  \(.*red\)\@!
°°°°°°°°°°  °°  °°°°°°°°°°°°
'This'      AND NOT 'red'

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

1

看一下这篇文章。

将其与@romainl答案结合使用,您可以做任何您想做的事情。

示例:假设我要向const不包含a 的函数中添加a 。

    handleChange = value => {

VIM脚本:

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

输出:

    const handleChange = value => {

说明:

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

-给我所有的行 word =

\&

-结合规则

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

-该行不应包含const

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.