vim – Multiple:g和:v命令在一个语句中

前端之家收集整理的这篇文章主要介绍了vim – Multiple:g和:v命令在一个语句中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这个文件
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来为这个功能和专门的命令.例如:
command! -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等等的范围,你可以在搜索字词里使用正则表达式,但你必须逃避你的空间.希望这可以帮助.

原文链接:https://www.f2er.com/bash/386375.html

猜你在找的Bash相关文章