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

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中的数据
Linux sed 之G、H、g、h使用命令详解_第1张图片

案例

[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

你可能感兴趣的