邋遢居

我的Java天堂

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

删除空行

g/^\s*$/d                  : delete all blank lines

 

这个里面使用了“:g”命令,Google了一下,找到了如下描述:

:g is something very old and which is very powerful. I just wanted to illustrate the use of it
with some examples. Hope, it will be useful for someone.
Brief explanation for ":g"
-------------------------
Syntax is:
    :[range]:g/<pattern>/[cmd]
You can think the working as, for the range (default whole file), execute
the colon command(ex) "cmd" for the lines matching <pattern>. Also, for all
lines that matched the pattern, "." is set to that particular line (for
certain commands if line is not specified "." (current line) is assumed).
Some examples
-------------
Display context (5 lines) for all occurences of a pattern
    :g/<pattern>/z#.5
    :g/<pattern>/z#.5|echo "=========="
    << same as first, but with some beautification >>
Delete all lines matching a pattern
    :g/<pattern>/d
Delete all blank lines (just an example for above)
    :g/^\s*$/d
Double space the file
    :g/^/pu =\"\n\"
    :g/^/pu _
    << the above one also works >>
Copy all lines matching a pattern to end of file
    :g/<pattern>/t$
Yank all lines matching a pattern to register 'a'
    0"ay0:g/<pattern>/y A
Increment the number items from current line to end-of-document by one
    :.,$g/^\d/exe "normal! \<c-a>"
Comment (C) lines containing "DEBUG" statements
    g/^\s*DEBUG/exe "norm! I/* \<Esc>A */\<Esc>"
A Reverse lookup for records
(eg: An address book, with Name on start-of-line and fields after a space)
    :g/<patern>?^\w?p               "if only name is interested
    :g/<patern>/ka|?^\w?p|'ap       "if name and the lookup-line is interested
    :g/<patern>/?^\w?|+,/^[^ ]/-1p  "if entire record is interested
Reverse a file (just to show the power of 'g')
    :g/^/m0
Foot note 1: use :v to negate the search pattern
Foot note 2: Some explanation of commonly used commands with :g
:2,8co15 => Copy lines 2 through 8 after line 15
:4,15t$  => Copy linesa 4 through 15 towards end of document (t == co)
    :-t$  => Copy previous line to end of document
     :m0  => Move current line to the top of the document
:.,+3m$-1 => Move current line through cur-line+3 to the last but one line
             of the document
Foot note 3: Commands used with :g are ex commands, so a help search should
             be,
                :help :<help-topic>
                eg. :help :k

尝试翻译如下

:g是一个非常老且很强的的命令。我只想通过一些例子来演示他的用法。希望对被人有用。

“:g”的概述

         语法::[rang]:g/<pattern>/[cmd]

你可以认为他是这么工作,在特定的范围内([rang]确定,默认是整个文件)。他逐行逐行的用<pattern>去匹配,如果匹配成功就执行 冒号命令 (“cmd”来指定)。另外,如果<pattern>匹配所有行,那么只有对当前行执行 冒号命令。

 

今后会不断更新……

 

--------------------------

:%s/^\(.*\)\n\1/\1$/        : 删除重复行 # 非贪婪匹配,\{-}

一会来分析

posted on 2008-05-28 10:55 Jet Geng 阅读(2455) 评论(3)  编辑  收藏

Feedback

# re: GVIM使用技巧汇集 2008-06-10 10:08 hamburger
最近在做一些文字处理碰到这样一个需求,为sql的insert语句增加一个排序Column,值当然就是1,2,3...了,目前只会一个尴尬的做法:

:g/table_name/s/);/,999);/ );是每个Sql的结尾
:let i=0 | g:/table_name/s/999/\=i | let i=i+1
不熟悉vim的语法,能不能一下子做到呢?
ps:我试了一下\=i后面可以用.abc来增加额外的内容。
我的邮箱hamburgerwang(a)gmail.com  回复  更多评论
  

# re: GVIM使用技巧汇集[未登录] 2012-07-27 15:59 lee
:let i=0 | g:/table_name/s/999/\=i | let i=i+1
这个语句有点问题
我用这个成功了
:let i=0 | g/table_name/s/999/\=i/ | let i=i+1  回复  更多评论
  

# re: GVIM使用技巧汇集[未登录] 2012-08-01 09:33 jet
谢谢lee,当时笔误!  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: