sed配合正則表達式應用

題目:要求用sed將/et/passwd的每一行的第一個數和最後一個單詞交換位置

[root@oldboy etc]# sed -n '1p' passwd

root:x:0:0:root:/root:/bin/bash

一、分析:sed替換配合正則表達式將會發揮最佳效果。下面來分析匹配特點:

因爲passwd文件每一行的特點都是一樣的,所以先提取第一列觀察,題目要求將第一個數字和最後一個單詞替換,所以整行至少會被分隔成4段,用sed替換()後向引用\1與\4交換位置即可。

特點分析

第1段root:x:         非數字

第2段0             純數字

第3段:0:root:/root:/bin/ 不以字母或數字開頭和不以字母或數字結尾

第4段bash           以字母結尾

二、寫出匹配的表達式:

1.([^0-9]+)

2.([0-9]+)

3.([^0-9].*[^0-9])或者([^a-z].*[^a-z])

4.([a-z]+$)

三、驗證: 

情況1:[root@oldboy etc]# sed -nr '1s#([^0-9]+)([0-9]+)([^0-9].*[^0-9])([a-z]+$)#\3#gp' passwd 

:0:root:/root:/bin/bas

情況2:[root@oldboy etc]# sed -nr '1s#([^0-9]+)([0-9]+)([^a-z].*[^a-z])([a-z]+$)#\3#gp' passwd 

:0:root:/root:/bin/

  經過驗證發現,當以非數字開頭和非數字結尾”這個條件作爲匹配時,是行不通的,因爲在想要匹配的字段(:0:root:/root:/bin/)後面是字母bash,匹配完前面的部分,後面的字符依然符號匹配要求,所以此處只能以“不以字母開頭&&者不以字母結尾”爲匹配條件。

根據1.2.3.4匹配條件可以得出結論:要將一種類型字符作爲匹配條件,儘量選擇非此類型作爲匹配條件,這樣才能將匹配條件縮到最小。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章