通过这个,grep
我可以grep -v "my search"
得到所有没有“我的搜索”的行。
和sed
我可以sed '/baz/!s/foo/bar/g'
在没有“baz”的行上找到替换文本。
有没有办法在 Vim 中做同样的事情?是否可以不使用“s///”语法,而只使用“/”搜索语法来做到这一点?
答案1
:g/pattern/
匹配找到的所有行。
:v/pattern/
则相反。请参阅:h global
以了解更多详细信息。
你可以像这样使用它:
:v/pattern/norm Ipattern not found - <CR>
在每个没有“pattern”的行前面加上“pattern not found - ”或
:v/pattern/s/nrettap/pattern
在每一行中将没有“pattern”的“nrettap”替换为“pattern”。
是的,这是人为的例子。
答案2
搜索行不是例如,包含 foo,则执行以下操作:
/^\(\(.*foo.*\)\@!.\)*$
来源:http://vim.wikia.com/wiki/Search_for_lines_not_containing_pattern_and_other_helpful_searches
答案3
使用 :v 命令查找不匹配模式的行的传统方法是使用:v 命令:
:v/Warning/p
当处理大型日志文件时,如果你想在开始真正的搜索之前过滤掉尽可能多的不相关的行,一个巧妙的技巧就是用临时名称保存文件并删除其中所有不匹配的行:
:sav junk.log
:v/warning/d
您现在正在编辑原始文件的克隆,其中所有不匹配“警告”的行都已被删除,您可以随意编辑它。
参考:https://vim.fandom.com/wiki/Search_for_lines_not_containing_pattern_and_other_helpful_searches
答案4
另一种方法是执行“外部 grep”;从手册(:help :grep
):
5.2 External grep
Vim can interface with "grep" and grep-like programs (such as the GNU
id-utils) in a similar way to its compiler integration (see |:make| above).
*:gr* *:grep*
:gr[ep][!] [arguments] Just like ":make", but use 'grepprg' instead of
'makeprg' and 'grepformat' instead of 'errorformat'.
When 'grepprg' is "internal" this works like
|:vimgrep|. Note that the pattern needs to be
enclosed in separator characters then.
If the encoding of the program output differs from the
'encoding' option, you can use the 'makeencoding'
option to specify the encoding.
*:lgr* *:lgrep*
:lgr[ep][!] [arguments] Same as ":grep", except the location list for the
current window is used instead of the quickfix list.
对我来说,grepprg
设置为:set grepprg
使用外部的默认值(参见)grep
,所以我可以这样做
:grep -v 'my_pattern' %
其中%
指的是当前文件的名称(参见:help :_%
)。
此后,可以使用:copen
或:lopen
在快速修复或位置列表中查找结果(分别取决于是否使用了:grep
或)。:lgrep
笔记
外部 grep 将始终在已保存文件,而不是缓冲区。当得到不一致的结果时,请记住这一点。