美文网首页
Linux sed 之G、H、g、h使用命令详解

Linux sed 之G、H、g、h使用命令详解

作者: Bigyong | 来源:发表于2020-08-05 23:21 被阅读0次
    sed执行过程,特点逐行处理

    1.把文本第1行读入到内存 模式空间(pattern space),相当于放到流程水线上处理吧
    2.把处理好的结果存放到另一个内存空间(hold space)相当于临时的仓库吧
    3.输出处理结果,循环处理第2行,覆盖清空(pattern space)、(hold space)至最后一行

    由于各种各样的原因,比如用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保留以便下一次的处理,都有可能使得sed在处理文件的时候不按照正常的流程来进行。这个时候,sed设置了一些高级命令来满足用户的要求。

    sed命令:

    • g:[address[,address]]g 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
    • G:[address[,address]]G 将hold space中的内容append到pattern space\n后
    • h:[address[,address]]h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
    • H:[address[,address]]H 将pattern space中的内容append到hold space\n后
    • d:[address[,address]]d 删除pattern中的所有行,并读入下一新行到pattern中
    • D:[address[,address]]D 删除multiline pattern中的第一行,不读入下一行

    不管是大写还是小写g、h都是在pattern space、hold space相互拷贝
    区别是 小写代表清空原来数据,大写是保留原来数据在后面追加新数据
    案例

    [root@case100 ~]# cat sed.txt 
    1
    2
    3
    
    [root@case100 ~]# sed '1!G;h;$!d' sed.txt    #ps:1!G第1行不 执行“G”命令,从第2行开始执行。 $!d,最后一行不删除(保留最后1行)
    3
    2
    1
    

    图解分析过程
    P:Pattern Space
    H:Hold Space
    蓝色:Hold Space中的数据
    绿色:Pattern Space中的数据


    案例

    [root@case100 ~]# cat sed2.txt 
    1
    2
    3
    4
    5
    [root@case100 ~]# sed '2h;5G' sed2.txt   #把第2行放到临时仓库(hold space),然后追加到(pattern space)第5行后面
    1
    2
    3
    4
    5
    2
    [root@case100 ~]# sed '2h;5g' sed2.txt  #把第2行放到临时仓库(hold space),然后覆盖掉(pattern space)第5行数据
    1
    2
    3
    4
    2
    [root@case100 ~]# sed '2h;3H;5g' sed2.txt   #把第2行、第3行放到临时仓库(hold space),然后覆盖掉(pattern space)第5行数据
    1
    2
    3
    4
    2
    3
    [root@case100 ~]# sed '2h;3h;5g' sed2.txt    #把第2行读入临时仓库(hold space);但被后面读入的第3行数据覆盖掉了,所以2h其实是无效的,然后第3行数据覆盖掉(pattern space)第5行数据
    1
    2
    3
    4
    3
    

    参考链接:
    https://www.cnblogs.com/fhefh/archive/2011/11/22/2259097.html

    相关文章

      网友评论

          本文标题:Linux sed 之G、H、g、h使用命令详解

          本文链接:https://www.haomeiwen.com/subject/dokorktx.html