題目:要求用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匹配條件可以得出結論:要將一種類型字符作爲匹配條件,儘量選擇非此類型作爲匹配條件,這樣才能將匹配條件縮到最小。