1.1 功能說明
stream editor 流編輯器,實作對檔案的增删改替換查
1.2 文法格式
sed [OPTION]... {script-only-if-no-other-script}[input-file]...
sed –n ‘/過濾内容/’處理的指令 檔案
sed –i ‘s#被替換内容#替換内容#g’ 檔案
參數 | 簡解 |
-n | 取消預設輸出 |
-i | 改變檔案内容 |
-r | 不用轉義,去掉馬甲 |
-e | 允許多項編輯 |
1.3 實踐操作
執行個體1-1
問題:列印出oldboy.txt中的oldboy字元串
指令:sed –n ‘/oldboy/’poldboy.txt
代碼
[root@ben-test ~]# sed -n '/oldboy/'p oldboy.txt
oldboy
說明:p 表示列印
執行個體1-2
問題:列印出ett.txt中20—30行的内容
指令:sed –n’20,30’p ett.txt
[root@ben-test ~]# sed -n '20,30'p ett.txt
20
21
22
23
24
25
26
27
28
29
30
說明:此處’20,30’表示20至30行
執行個體1-3
問題:把oldboy.txt中的oldboy删除,列印出内容
指令:sed –i ‘/oldboy/’doldboy.txt
[root@ben-test ~]# sed -i '/oldboy/'d oldboy.txt
[root@ben-test ~]# cat oldboy.txt
test
liyao
說明:d 表示删除輸出
-i 表示改變檔案内容,如果不加-i參數,隻列印删除後的内容,而沒有真正改變檔案中的内容
執行個體1-4
問題:把oldboy.txt中的test替換成oldboy
指令:sed –i‘s#test#oldboy#g’ oldboy.txt
[root@ben-test ~]# sed -i 's#test#oldboy#g'oldboy.txt
[root@ben-test ~]# cat oldboy.txt
說明:s查找并替換,用一個字元串替換另一個字元串
g(global)與s聯合使用時,表示對目前行全局替換
#是分隔符号,可以用/@等替換
執行個體1-5
問題:如何過濾出已知目前目錄下/root中的所有一級目錄(不包含var目錄下面的目錄及隐藏目錄,即隻能是一級目錄)
指令:ls –l /root|sed –n ‘/^d/’p
[root@ben-test ~]# ls -l /root |sed -n '/^d/'p
drwxr-xr-x 2 root root 4096 Sep 15 07:03 aa
drwxr-xr-x 3 root root 4096 Sep 15 03:34data
drwxr-xr-x 12 root root 4096 Sep 15 07:18test
執行個體1-6
問題:把/root/data目錄中含有oldboy字元的檔案,都把oldboy替換成oldgirl
指令1:sed –i ‘s#oldboy#oldgirl#g’ `grep–lr oldboy /root/data`
[root@ben-test ~]# sed -i 's#oldboy#oldgirl#g'`grep -lr oldboy /root/data`
[root@ben-test ~]# grep -lr oldboy /root/data
[root@ben-test ~]# grep -lr oldgirl /root/data
/root/data/a.sh
/root/data/test/aa.txt
指令2:sed –i ‘s#oldboy#oldgirl#g’ `find/root/data –type f –name “*”`
[root@ben-test ~]# sed -i 's#oldboy#oldgirl#g'`find /root/data -type f -name "*"`
執行個體1-7
問題:删除oldboy列印oldboy.txt中的内容,同時把liyao替換成oldgirl
指令:sed –e ‘/oldboy/’d–e ‘s#liyao#oldgirl#g’ /root/oldboy.txt
[root@ben-test ~]# sed -e '/oldboy/'d -e's#liyao#oldgirl#g' oldboy.txt (沒有改變檔案内容)
oldgirl
說明:如果需要改變檔案内容,如下
sed-e '/oldboy/'d –i -e 's#liyao#oldgirl#g' –i /root/oldboy.txt
執行個體1-8 追加内容到指定行後
文本内容如下,person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@ben-test ~]# sed '2a 106,dandan,CSO'person.txt
106,dandan,CSO <== 插入内容
說明:參數a是追加文本到指定行後,2a表示把内容追加到第二行的下一行
執行個體1-9 插入文本到指定行前
[root@ben-test ~]# sed '2i 106,dandan,CSO'person.txt
說明:參數i是插入文本到指定行前,2i表示把内容插入到第二行的上一行
執行個體1-10 多行内容插入
[root@ben-test ~]# sed '2a 106,dandan,CSO\n107,bingbing,CCO'person.txt
106,dandan,CSO
107,bingbing,CCO
或
[root@ben-test ~]# sed '2a 106,dandan,CSO \ <== \符号是進入換行編輯
> 107,bingbing,CCO' person.txt
106,dandan,CSO
說明:\n是換行符
注意:sed軟體可以對單行或多行進行處理。如果在sed指令前面不指定位址範圍,那麼預設會比對所有行。
用法:n1[,n2]{sed-commands}
位址用逗号分隔的,n1,n2可以用數字、正規表達式、或二者的組合表示。
例子:
10{sed-commands} 對第10行操作
10,20{sed-commands} 對10到20行操作,包括第10,20行
10,+20{sed-commands} 對10到30(10+20)行操作,包括第10,30行
1~2{sed-commands} 對1,3,5,7,……行操作
10,${sed-commands} 對10到最後一行($代表最後一行)操作,包括第10行
/oldboy/{sed-commands} 對比對oldboy的行操作
/oldboy/,/Alex/{sed-commands} 對比對oldboy的行到比對Alex的行操作
/oldboy/,${sed-commands} 對比對oldboy的行到最後一行操作
/oldboy/,10{sed-commands} 對比對oldboy的行到第10行操作,注意:如果前10行沒有比對到oldboy,sed軟體會顯示10行以後的比對oldboy的行,如果有。
1,/Alex/{sed-commands} 對第1行到比對Alex的行操作
/oldboy/,+2{sed-commands} 對比對oldboy的行到其後的2行操作
執行個體1-11 正規表達式比對删除
[root@ben-test ~]# sed '/zhangyao/,3d' person.txt
101,oldboy,CEO (1)
104,yy,CFO (4)
105,feixue,CIO (5)
說明:比對到zhangyao字元串,對此行到第3行操作删除
[root@ben-test ~]# sed '/zhangyao/,+3d' person.txt
說明:對比對到zhangyao字元串,還有此行的後3行進行删除
[root@ben-test ~]# sed '/^.*ex.*$/,4d'person.txt
說明:正規表達式比對到含有ex字元的行,然後進行操作删除
執行個體1-12 用新行替換舊行
[root@ben-test ~]# sed '2c 107,bingbing,CCO'person.txt