博客 / 詳情

返回

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中的數據

案例

[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

user avatar huorongsecurity 頭像 guaguokedeluobo_dkxrgk 頭像
2 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.