vim g的作用及与s的区别

一、g的作用:

	global命令在[range]指定的文本范围内(缺省为整个文件)查找{pattern},然后对匹配到的行执行命令{command},如果希望对没匹配上的行执行命令,则使用global!或vglobal命令

【例1】倒序文件行(即unix下的tac命令)

:g/^/m 0

这条命令用行首标记/^/匹配文件的所有行(这是查找的一个常用技巧,如果用/./则是匹配非空行,不满足本例要求),然后用move命令依次将每行移到第一行(第0行的下一行),从而实现了倒序功能。

global命令实际上是分成两步执行:
1、首先扫描[range]指定范围内的所有行,给匹配{pattern}的行打上标记;
2、然后依次对打有标记的行执行{command}命令,如果被标记的行在对之前匹配行的命令操作中被删除、移动或合并,则其标记自动消失,而不对该行执行{command}命令。标记的概念很重要,以例说明。

【例2】删除偶数行

:g/^/+1 d

这条命令也是匹配所有行,然后隔行删除(其中+1用以定位于当前行的下一行)。为什么是隔行呢?因为在对第一行执行+1 d命令时删除的是第二行,而第二行虽然也被标记了,但已不存在了,因此不会执行删除第三行的命令。

【例3】删除奇数行

:g/^/d|m.

光是:g/^/d显然不行,这会删除所有行,我们需要用move命令把偶数行的标记去掉。当然,本例可以很简单的转换成【例2】,在此只是用来强调标记的概念

二、g与s的区别

g是全局搜索,扫描所有行,然后执行相应动作;删除、替换、连接、打印操作等
s只是用于替换

【例4】替换操作

    使用:g执行替换操作
    :g/first-search-pattern/s/match-pattern/substitute-pattern/g
    :g/foo/s/bar/blah/g
    将包含有foo的行先找出来,然后再执行bar->blah替换操作

【例5】double所有行

:%s/.*/&r&/

:g/^/t.

substitue是查找任意行,然后替换为两行夹回车;global是将每一行复制(:t就是:copy)到自己下面,更加清晰明了

[例6] 删除空行

删除空行 :g/^$/d
删除空行以及只有空格的行 :g/^\s*$/d
删除以# 开头或空格# 或tab#开头的行 :g/^\s*#/d

s无法实现这功能

三、结论

g的power远比s强大

你可能感兴趣的:(vim,数据分析)