編輯文本一般可使用vi,可是有時須要經過命令去編輯文件,這時就須要使用流編輯器sed正則表達式
1、sed概述
sed(stream editor的縮寫),能夠對標準輸入流中的獲得的數據進行出路,而後把處理後的結果輸出到標準輸出,固然標準輸入和標準輸出均可以重定向。
通常狀況,sed只會對流經它的數據流進行處理,而不會對原文件作任何修改。若是須要作修改須要使用 -ishell
sed命令的經常使用形式:
1)從管道獲取數據流
command | sed 'edit commands'緩存
2)從文件讀取數據流
sed 'edit commands' filenamebash
其中edit commands是sed的一系列編輯命令,sed會根據這些命令處理數據流。filename能夠是多個文件。
單引號不是必需的,這裏只是標識編輯命令的開始和結束。
使用單引號,更重要的是,編輯命令中有特殊字符,須要使用特殊字符原樣,防止shell解釋或擴展特殊字符。爲使用特殊字符原樣,也可使用反斜槓\
若是要保留特殊字符的含義,如變量替換,命令替換等等,可使用雙引號。編輯器
sed命令執行時,從文件或管道中的數據中,每次讀取一行數據,並把數據複製到sed的工做緩存中。此處緩存稱爲模式空間,全部的數據都是在這裏處理,
而後sed根據指定的編輯命令(edit commands)處理數據,處理完一行數據後,sed會讀取下一行數據,重複執行編輯命令,直到數據被處理完爲止。it
以上步驟說明:sed實際是使用相同的編輯命令對匹配到的每一行數據進行處理,直到全部行被處理完,文件或管道數據流關閉,sed命令退出。io
編輯命令格式:
/pattern/action
pattern是正則表達式,/標識正則表達式的開始和結束。使用多個edit commands時,可使用分號分隔,也可使用-e 'command',還可使用-f sed_file
如:
[root@mrhcatxq01 shell]# sed 's/2/222/g;s/0/000/g' passwdbak #使用分號分隔2個s///g命令
root:x:000:000:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:222:222:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@mrhcatxq01 shell]# sed -e 's/2/222/g' -e 's/0/000/g' passwdbak #使用-e 執行2個s///g命令
root:x:000:000:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:222:222:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@mrhcatxq01 shell]# cat filesed #每一個編輯命令佔一行,若多個命令寫一行須要分號分隔
s/2/222/g
s/0/000/g
[root@mrhcatxq01 shell]# sed -f filesed passwdbak #使用-f filename執行2個s///g命令
root:x:000:000:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:222:222:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologintest
2、sed常見用法
[root@mrhcatxq01 shell]# head -4 passwdbak
root:x:0:0:root:/root:/bin/bash
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
[root@mrhcatxq01 shell]#stream
1.替換 s/old/new/ 或 s/old/new/g
[root@mrhcatxq01 shell]# head -4 passwdbak | sed 's/2/test2/' #替換每行的第一次出現的2爲test2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:test2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@mrhcatxq01 shell]# head -4 passwdbak | sed 's/2/test2/g' #替換每行的全部2爲test2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:test2:test2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
2.插入 i
[root@mrhcatxq01 shell]# head -4 passwdbak | sed '1i #/bin/bash'
#/bin/bash
root:x:0:0:root:/root:/bin/bash
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
[root@mrhcatxq01 shell]#變量
3.刪除和打印 (d和p)
獲取數據源:
head /etc/passwd | cat -n > passwd.bak
vi passwd.bak
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
#3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
#4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
1)刪除某一行(刪除第2行)
[root@mrhcatxq01 shell]# sed -e '2d' passwd.bak
1 root:x:0:0:root:/root:/bin/bash
#3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
#4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
2)刪除第n行到第m行(刪除第2行到第6行)
[root@mrhcatxq01 shell]# sed -e '2,6d' passwd.bak
1 root:x:0:0:root:/root:/bin/bash
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
3)刪除全部行
[root@mrhcatxq01 shell]# sed -e 'd' passwd.bak
4)刪除匹配行(以#開頭)
[root@mrhcatxq01 shell]# sed -e '/^#/d' passwd.bak
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
5)打印匹配行
[root@mrhcatxq01 shell]# sed -n -e '/^#/p' passwd.bak
#3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
#4 adm:x:3:4:adm:/var/adm:/sbin/nologin
#6 sync:x:5:0:sync:/sbin:/bin/sync
6)打印匹配行到匹配行(daemon到sync)
[root@mrhcatxq01 shell]# sed -n -e '/daemon/,/sync/p' passwd.bak
#3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
#4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#6 sync:x:5:0:sync:/sbin:/bin/sync
4.使用匹配到的行 & [root@mrhcatxq01 shell]# head -4 passwdbak | sed 's/^root/#&/' #root:x:0:0:root:/root:/bin/bash 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 [root@mrhcatxq01 shell]#