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

2020-08-05  本文已影响0人  Bigyong
sed执行过程,特点逐行处理

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

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

sed命令:

不管是大写还是小写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

上一篇下一篇

猜你喜欢

热点阅读