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并且不包含栏的行 我读了某个地方(找不到链接),我必须使用: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等等的范围,你可以在搜索字词里使用正则表达式,但你必须逃避你的空间.希望这可以帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |