加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 18:47:58 所属栏目:安全 来源:网络整理
导读:我有这个文件 foofoo barfoo bar bazbar bazfoo bazbaz barbarbazfoo 42foo bar 42 bazbaz 42 我要 选择包含foo并且不包含栏的行 删除包含foo并且不包含栏的行 我读了某个地方(找不到链接),我必须使用:exec with |为了这. 我试过以下,但它不工作 :exec "g/f
我有这个文件
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等等的范围,你可以在搜索字词里使用正则表达式,但你必须逃避你的空间.希望这可以帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读