我有这个文件
foo foo bar foo bar baz bar baz foo baz baz bar bar baz foo 42 foo bar 42 baz baz 42
我要
>选择包含foo并且不包含栏的行
>删除包含foo并且不包含栏的行
我读了某个地方(找不到链接),我必须使用:exec with |为了这.
我试过以下,但它不工作
:exec "g/foo" # works :exec "g/foo" | exec "g/bar" -- first returns lines with foo,then with bar :exec "g/foo" | :g/bar -- same as above
而如果我不能选择一行,我就不能执行正常的dd.
有任何想法吗?
编辑
赏金注意事项:
我正在寻找一个使用正确的:g和:v命令的解决方案,并且不使用正则表达式黑客,因为条件可能不一样(我可以有2个包含,3个不包括).
还要注意,最后2个不起作用的例子,它们只能删除行,但是当我们运行它们而不删除(即查看所选行)时它们返回不正确的信息,它们的行为如上所述.
这可能仍然是你的黑客,但你可以编写一些vimscript来为这个功能和专门的命令.例如:
原文链接:https://www.f2er.com/bash/386375.htmlcommand! -nargs=* -range=% G <line1>,<line2>call MultiG(<f-args>) fun! MultiG(...) range let pattern = "" let command = "" for i in a:000 if i[0] == "-" let pattern .= "\\(.*\\<".strpart(i,1)."\\>\\)\\@!" elseif i[0] == "+" let pattern .= "\\(.*\\<".strpart(i,1)."\\>\\)\\@=" else let command = i endif endfor exe a:firstline.",".a:lastline."g/".pattern."/".command endfun
这将创建一个命令,允许您自动执行“正则表达式黑客”.你可以这样做
:G +foo -bar
以foo而不是bar来获取所有行.如果一个参数不是以 – 开头,那么它被认为是添加到:g命令结尾的命令.所以你也可以做
:G d +foo -bar
删除行,甚至
:G norm\ foXp +two\ foos -bar
如果你逃避你的空间.它还需要一个像1,3G等等的范围,你可以在搜索字词里使用正则表达式,但你必须逃避你的空间.希望这可以帮助.