• vim g的作用及与s的区别


    一、g的作用:

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

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

    :g/^/m 0
    
    • 1

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

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

    【例2】删除偶数行

    :g/^/+1 d
    
    • 1

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

    【例3】删除奇数行

    :g/^/d|m.
    
    • 1

    光是: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替换操作
    
    • 1
    • 2
    • 3
    • 4

    【例5】double所有行

    :%s/.*/&r&/
    
    :g/^/t.
    
    • 1
    • 2
    • 3

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

    [例6] 删除空行

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

    s无法实现这功能

    三、结论

    g的power远比s强大

  • 相关阅读:
    新零售SaaS架构:订单履约系统的概念模型设计
    编程模式-表驱动编程
    C++信息学奥赛1169:大整数减法
    在混合云中优化边缘计算的三种方法
    TiDB x 北京银行丨新一代分布式数据库的探索与实践
    FL水果21编曲宿主软件最新版本更新下载使用教程
    GEE开发之Landsat_SR计算地表温度(不推荐)
    责任链模式
    Revit SDK 介绍:RayTraceBounce 光线反弹
    Unity16 UI
  • 原文地址:https://blog.csdn.net/ningyanggege/article/details/128074043