如何在VIM中选择所有不包含“hello”字样的行?我需要它猛拉然后保存到文件中。我该怎么做?我正在寻找类似的东西:
:v /!(你好)>档案
答案 0 :(得分:11)
:g!/hello/ yank A
这些行现在存储在寄存器a中,要粘贴它们做“ap
编辑: 可以缩写为
:g!/hello/y A
对于那些对vim意味着什么感兴趣的人:
:g =全球搜索
! =否定布尔测试
/ hello / =匹配“hello”的正则表达式
y =在每条匹配线上执行的命令,在这种情况下为“yank”
A =注册“yank”命令的参数。在这种情况下,寄存器'a'但是以大写形式的意思附加到寄存器而不是替换。
答案 1 :(得分:9)
如果系统上有grep
,则可以使用此命令:
:!grep -v hello % > file
答案 2 :(得分:6)
到目前为止,我没有看到提及的替代方案,是redirecton。
因此,对于您的情况,这将是
:redir > file
:g!/hello/
:redir END
另见
:help redir
:help verbosefile
答案 3 :(得分:5)
我通常使用
的一些变体来做这件事:g/hello/d
即。删除包含“hello”的所有内容,然后选择,抽取或需要完成的任何事情,最后还原回击你。 我发现这对构建命令行管道的精神负担较轻。
答案 4 :(得分:4)
fgm的回答几乎就在那里
:v将选择不匹配的行
所以以下内容会将不包含“hello”的行追加到名为eee的文件中,并在需要时创建它。
:v/hello/ . w!>>eee
答案 5 :(得分:1)
选择并写入新文件:
:g/hello/ . w!>> file
答案 6 :(得分:1)
非常直接;
:v/hello/ |redir >> file
答案 7 :(得分:0)
在Vim命令之后
:let @a='' | g!/hello/normal "Ayy
你将在寄存器'a'中拥有所有没有'hello'的行。您可以使用“ap normal命令将其值粘贴或使用
将此值放入系统剪贴板:let @*=@a
然后您可以在Windows上使用'Ctrl + V'或在Mac OS上使用'Cmd + V'或在Linux上使用'鼠标中键'来粘贴文本。
魔术的简要描述:
@a 是一个Vim变量,它绑定到存储在'a'寄存器中的值。
“ap ,”bp ,“cp ,..是Vim正常模式中超过特定寄存器值的组合键。
@ * 是绑定到系统剪贴板的Vim变量
让@ * = @a 将值从寄存器'a'放入系统剪贴板。
将此添加到.vimrc或使用插件目录创建文件。
function s:copy_unmathced_lines(pattern)
let result_lines = []
for line in getline(1, '$')
if line !~ a:pattern
call add(result_lines, line)
endif
endfor
let @* = join(result_lines, "\n")
endfunction
command -nargs=1 CopyUnmatchedLines call s:copy_unmathced_lines(<q-args>)
用例很简单:
CopyUnmatchedLines hello
然后在任何编辑器中使用paste命令。
答案 8 :(得分:0)
Blixtor代码片段的实用示例:使用“:verbosefile”将朋友丢失。
予。打开手册“:e / tmp / new_file”和“:h verbosefile”,然后让我们复制cat blixtor的提示:
:redir > /tmp/verbosefile_instructions
:g/verbosefile/
:redir END
II。确认您遵循有关电子邮件标准的标准规则,并提供标准问候语:
:match ErrorMsg /\%>73v.\+/
:so /bin/greetings.vim
III。用Mutt发送文件。
答案 9 :(得分:0)
关于视觉选择和复制的示例:假设您要分离部件:
视觉选择它并按“:”
然后使用命令:
: '&LT;,' &GT; ! &GT; ../ new_file_in_a_subdirectory
错误:颜色将被复制到文件中,并且它实际上并不是复制而是剪切和粘贴。