SED是一種流編輯器,它是文本處理中非常中的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有 改變,除非你使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操作;編寫轉換程序等。
SED的命令執行流程
sed會從數據中一條一條的讀取命令,逐條處理和輸出,直到數據的最後一行。
模式空間:sed軟件內部的一個臨時緩存,用於存放讀取到的內容。
SED命令和功能
- 命令格式
sed [options] [command] [inputfile(s)]
sed [options] -f scriptfile
文中統一實驗文件
[root@CentOS7 ~]$cat test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
- 選項
-n:不輸出模式空間內容到屏幕,即不自動打印
-e: 多點編輯
-f: /PATH/SCRIPT_FILE: 從指定文件中讀取編輯腳本
-r: 支持使用擴展正則表達式
-i.bak: 備份文件並原處編輯
-h或–help:顯示幫助
-V或–version:顯示版本信息
- sed命令
a\ -在當前行下面插入文本。
i\ -在當前行上面插入文本。
d -刪除,刪除選擇的行。
D -刪除模板塊的第一行。
s -替換指定字符
h -拷貝模板塊的內容到內存中的緩衝區。
H -追加模板塊的內容到內存中的緩衝區。
g - 獲得內存緩衝區的內容,並替代當前模板塊中的文本。
G -獲得內存緩衝區的內容,並追加到當前模板塊文本的後面。
l -列表不能打印字符的清單。
n -讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。
N -追加下一個輸入行到模板塊後面並在二者間嵌入一個新行,改變當前行號碼。
p -打印模板塊的行。 P(大寫) 打印模板塊的第一行。
q -退出Sed。
! -表示後面的命令對所有沒有被選定的行發生作用。
= -打印當前行號碼。 # 把註釋擴展到下一個換行符以前。
查找替換
s///:查找替換,支持使用其它分隔符, s@@@, s###替換標記:
g: 行內全局替換
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中
地址定界:
(1) 不給地址:對全文進行處理
(2) 單地址:
#:指定的行
/pattern/:被此處模式所能夠匹配到的每一行
(3) 地址範圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步進
1~2 奇數行
2~2 偶數行
實例演示
1、輸出原數據並打印第二行
[root@CentOS7 ~]$sed '2p' test
aaa,bbb,ccc
ddd,eee,fff
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
2、只打印數據第二行
[root@CentOS7 ~]$sed -n '2p' test
ddd,eee,fff
3、打印1到4行
[root@CentOS7 ~]$sed -n '1,4p' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
4、只打印含有“ggg”的行
[root@CentOS7 ~]$sed -n '/ggg/p' test
ggg,hhh,iii
5、打印從第二行到含有”ggg”的行
[root@CentOS7 ~]$sed -n '2,/ggg/p' test
ddd,eee,fff
ggg,hhh,iii
6、顯示空行行號
[root@CentOS7 ~]$sed -n '/^$/=' test
6
7、打印空行和空行行號
sed -n -e '/^$/p' -e '/^$/=' test
6
8、在含有“ggg”的行後加入“test”
[root@CentOS7 ~]$sed '/ggg/a\test' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
test
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
9、在含有“ggg”行前加上“test”
[root@CentOS7 ~]$sed '/ggg/i\test' test
aaa,bbb,ccc
ddd,eee,fff
test
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
10、將含有“ggg”的行替換成“test”
[root@CentOS7 ~]$sed '/ggg/c\test' test
aaa,bbb,ccc
ddd,eee,fff
test
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
11、刪除空行
[root@CentOS7 ~]$sed '/^$/d' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
12、將文件中前3行刪除
[root@CentOS7 ~]$sed '1,3d' test
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
13、使用管道刪除2到4行
[root@CentOS7 ~]$nl test | sed '2,4d'
1 aaa,bbb,ccc
5 mmm,nnn,ooo
6 ppp,qqq,rrr
14、將文件中的“ggg”替換成“XXX”
[root@CentOS7 ~]$sed 's/g/X/g' test
aaa,bbb,ccc
ddd,eee,fff
XXX,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
[root@CentOS7 ~]$sed 's/ggg/XXX/' test
aaa,bbb,ccc
ddd,eee,fff
XXX,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
15、在“ggg”單詞前加入“XXX”
[root@CentOS7 ~]$sed -n 's/ggg/XXX&/p' test
XXXggg,hhh,iii
16、在“ggg”單詞後面加入“XXX”
[root@CentOS7 ~]$sed -n 's/ggg/&XXX/p' test
gggXXX,hhh,iii
17、將“ggg”替換成“XXX”,並將“ooo”替換成“YYY”
[root@CentOS7 ~]$sed -e 's/g/X/g' -e 's/ooo/YYY/' test
aaa,bbb,ccc
ddd,eee,fff
XXX,hhh,iii
jjj,kkk,lll
mmm,nnn,YYY
ppp,qqq,rrr
18、將“ggg”替換成“XXX”並備份一份.bak文件
[root@CentOS7 ~]$sed -i.bak 's/ggg/xxx/' test
[root@CentOS7 ~]$cat test.bak
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
[root@CentOS7 ~]$cat test
aaa,bbb,ccc
ddd,eee,fff
xxx,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
19、打印奇數行
[root@CentOS7 ~]$cat test | sed -n '1~2p'
aaa,bbb,ccc
ggg,hhh,iii
mmm,nnn,ooo
ppp,qqq,rrr
20、打印偶數行
[root@CentOS7 ~]$cat test | sed -n '2~2p'
ddd,eee,fff
jjj,kkk,lll
[root@CentOS7 ~]$sed -n 'n;p' test
ddd,eee,fff
jjj,kkk,lll
21、倒敘顯示文件內容
[root@CentOS7 ~]$sed '1!G;h;$!d' test
ppp,qqq,rrr
mmm,nnn,ooo
jjj,kkk,lll
ggg,hhh,iii
ddd,eee,fff
aaa,bbb,ccc
[root@CentOS7 ~]$sed -n '1!G;h;$p' test
ppp,qqq,rrr
mmm,nnn,ooo
jjj,kkk,lll
ggg,hhh,iii
ddd,eee,fff
aaa,bbb,ccc
22、顯示文件的最後一行
[root@CentOS7 ~]$sed 'N;D' test
ppp,qqq,rrr
[root@CentOS7 ~]$sed '$!d' test
ppp,qqq,rrr
23、顯示文件的最後兩行
[root@CentOS7 ~]$sed '$!N;$!D' test
ppp,qqq,rrr
24、每行後面加入空行
[root@CentOS7 ~]$sed 'G' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
25、將文件所有內容改成空行
[root@CentOS7 ~]$sed 'g' test
26、將文件中空行刪除,之後在每行後面插入空行
[root@CentOS7 ~]$sed '/^$/d;G' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr
27、刪除文件中的偶數行
[root@CentOS7 ~]$sed 'n;d' test
aaa,bbb,ccc
ggg,hhh,iii
mmm,nnn,ooo
ppp,qqq,rrr