1. 程式人生 > >sed高級命令及模式空間和交換空間簡介

sed高級命令及模式空間和交換空間簡介

模式空間 保持空間 sed

高級命令

之前我們用到的sed命令都是一行一行的進行處理文本的,不過有些時候單行處理可能並不能滿足我們的需要,所以sed還提供了多行模式,多行模式的命令主要有NPD這三個,
N:讀取匹配到的行的下一行追加至模式空間
P:打印模式空間開端至\n內容,並追加到默認輸出之前
D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本, 並不會讀取新的輸入行,而使用合成的模式空間重新啟動循環。如果模式空間 不包含換行符,則會像發出d命令那樣啟動正常的新循環
首先還是先看一下N命令的大致流程圖,P和D命令在懂了N命令之後也容易理解。
技術分享圖片
需要註意的是,之所以叫多行模式是因為可以存放不止兩行,如下示例:

[root@VM_161_150_centos ~]# cat /etc/passwd |sed -n ‘2{N;p}‘
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

### 讀取第二行的下一行,然後輸出模式空間中的內容,此時模式空間中有兩行

[root@VM_161_150_centos ~]# cat /etc/passwd |sed -n ‘2{N;N;N;p}‘
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

### 使用多個N命令可以讀取多行進模式空間

模式空間

除了模式空間,sed命令還有另外一個空間叫保持空間,其實保持空間很容易理解,之前我們說sed在處理文本的時候都是在模式空間中進行,但有時候有些復雜的操作單一的模式空間可能無法滿足我們的需求於是就有了模式空間,模式空間你可以看作是模式空間的翻版,但是這個空間通常是空閑的,並不處理數據,只在有需要的時候和模式空間進行一些必要的數據交換。下面是模式空間中的常用命令。
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
打個比方,假如你有兩個杯子,

h 就相當於吧二個杯子中的東西替換為第一個杯子中的,
H就相當於把第一個杯子中的東西放到第二個杯子中,並且第二個杯子中的東西還在,
g和h相似,不過是反了過來吧第一個杯子中的東西替換為第二個杯子中的,
G也是和H類似,x就相當於把兩個杯子中的東西進行了交換。

下面通過幾個示例演示一下

[root@VM_161_150_centos ~]# seq 1 6| sed -n ‘1,2H;4p;5{x;p}‘
4

1
2

解釋一下,-n是不顯示默認輸出內容,1,2H是將前兩行追加至保持空間,4p顯示第四行,5{x;p}是在第五行的時候交換保持空間和模式空間中的內容並且輸出。註意輸出中的空行,這是因為H命令追加的時候是添加換行符,由於保持空間默認是空的,所以添加換行符之後就多了一個空行。以用下面的命令先往保持空間覆蓋一行然後追加。

[root@VM_161_150_centos ~]# seq 1 6| sed -n ‘1h;2H;4p;5{x;p}‘
4
1
2

第一個循環結束之後:模式空間為空,保持空間為第一行內容
第二個循環,將第二行追加到模式空間,此時模式空間為兩行內容
第三個循環,沒有匹配內容,不執行操作,模式空間和保持空間內容不變
第四個循環,讀取第四行並輸出,保持空間內容不變
第五個循環,讀入第五行,然後和保持空間中的內容交換,之後輸出。

sed高級命令及模式空間和交換空間簡介