1.sed指令參數詳解
sed [options] [function] [input-file]
sed 選項動作輸入檔案
選項與參數:
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的資料一般都會被列出到終端上。但如果加上 -n參數後,則隻有經過sed 特殊處理的那一行(或者動作)才會被列出來.如:sed -n '2,5p' sed.txt(将2-5行列印出來)
-e :直接在指令列模式上進行 sed 的動作編輯;
-f :直接将 sed 的動作寫在一個檔案内, -f filename 則可以運作 filename 内的 sed 動作;
-r :sed 的動作支援的是延伸型正規表示法的文法。(預設是基礎正規表示法文法)
-i :直接修改讀取的檔案内容,而不是輸出到終端。
動作說明: [n1[,n2]]function
n1, n2 :不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』
function:
a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!如:sed ‘2c fengxiaoli’ sed.txt(把第二行替換為fengxiaoli,不常用)
d :删除,因為是删除啊,是以 d 後面通常不接任何咚咚;
i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p :列印,亦即将某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~
s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g
2.sed指令執行的位址範圍
10[function]比對到第10行
10,20[function]比對到10-20行
10,+20[function]比對10行開始之後的20行
1~2[function]比對(以1開頭 2間隔)1,3,7,9
2~2[function]比對 2,4,6,8
10,$[function]比對10行到結尾
/zhangyao/[function]比對有zhangyao的那一行
/zhangyao/,/Alex/[function]比對有zhangyao的那一行到有Alex的那一行,若有重複字元串請自行測試
/zhangyao/,$[function]比對有zhangyao的那一行到結尾
10,/Alex/[function]比對10行到有Alex的那一行
/zhangyao/,+20[function]比對有zhangyao的那一行開始之後的20行
/Alex/,10[function]比對有Alex的那一行到10行
3.增删查改
3.1增加(可以指定上面的範圍測試)
sed '2a 3fengxiaoli' sed.txt(a增加在第二行的後面)
sed '2a 3fengxiaoli\n4wangcheng' sed.txt(多行增加)
sed '2i fengxiaoli' sed.txt(i增加在第二行的前面)
3.2删除(可以指定上面的範圍測試)
sed '2d' sed.txt (删除第二行)
sed '2,5d' sed.txt (删除2-5行)
3.3.1替換(可以指定範圍,不指定範圍就是替換全部比對的字元串)
sed ‘s#替換之前字元串#替換之後字元串#g’ sed.txt
sed ‘s/替換之前字元串/替換之後字元串/g’ sed.txt
例1:sed -i '5s#disabled#enforcing#g' /etc/selinux/config
3.3.2分組替換
echo I am oldboy teacher |sed 's#^.*am \([a-z].*\) tea.*$#\1#g'
(藍色的是任意以am開頭,tea任意結尾;紅色的\([a-z].*\) 是替換之後的内容,也就是oldboy,替換之後以\1輸出;小括号是擴充正規表達式,如果沒加-r需要\轉義)
echo I am oldboy teacher |sed 's#I \(.*\) \([a-z].*\) tea.*$#\1 \2#g'(最多隻支援9個括号)
3.33Ms# # #Ng
Ms 對M行操作,無g标志則對比對的第1列處理,有g則對這一行處理
如:
[root@www test]# cat sed.txt
1 1 1 1
[root@www test]# sed 's#1#0#' sed.txt
0 1 1 1
Ng 從第N處列開始到結尾替換
[root@www test]# sed 's#1#0#2g' sed.txt
1 0 0 0
Mg Ng 對第M行從第N處到結尾比對替換
[root@www test]# sed '2s#1#0#2g' sed.txt
企業案例1:
[root@www ~]# chkconfig --list |grep 3:on|grep -Ev "sshd|crond|network|rsyslog|sysstat"|awk '{print $1}'|sed -r 's#(.*)#chkconfig \1 off#g'
chkconfig abrt-ccpp off
chkconfig abrtd off
chkconfig acpid off
chkconfig atd off
chkconfig auditd off
chkconfig autofs off
...................
案例2:
[root@www test]# for i in {1..5};do touch stu_10299_${i}_finished.jpg;done
[root@www test]# ls
stu_10299_1_finished.jpg stu_10299_3_finished.jpg stu_10299_5_finished.jpg
stu_10299_2_finished.jpg stu_10299_4_finished.jpg
[root@www test]# ls *.jpg|sed -r 's#(.*)_finished.*#mv & \1.jpg#g'(這裡&表示原來的檔案名)
mv stu_10299_1_finished.jpg stu_10299_1.jpg
mv stu_10299_2_finished.jpg stu_10299_2.jpg
mv stu_10299_3_finished.jpg stu_10299_3.jpg
mv stu_10299_4_finished.jpg stu_10299_4.jpg
mv stu_10299_5_finished.jpg stu_10299_5.jpg
3.4查(列印)
sed -n '2p' sed.txt(-n 參數一般和p連用)
sed -n ‘s#zhangyao#NB#p’ sed.txt
4.修改檔案
sed -i 's#vn#fengxiaoli#g' sed.txt
[root@www test]# sed -i.back 's#vnsvf#fengxiaoli#g' sed.txt (修改檔案的同時将源檔案備份)
adfja
qwianf
ariung
ljjqf
fengxiaoli
[root@www test]# cat sed.txt.back
vnsvf
5.1忽略大小寫舉例
FENGxiaolisvf
[root@www test]# sed 's#fengxiaolisvf#fengxiaoli#gi' sed.txt
5.2改變指定位置大小寫
ceo,101,OLDBOY
cto,102,ZHANGYAO
coo,103,ALEX
cfo,104,YY
cio,105,FEIXUE
[root@www test]# sed -r 's#(.*),(.*),(.*)#\L\3, \E\1, \U\2#g' sed.txt
oldboy, ceo, 101
zhangyao, cto, 102
alex, coo, 103
yy, cfo, 104
feixue, cio, 105
注:\l在替換字元中使用\l标志時,它會把緊跟在其後面的第一個字元當做小寫字元處理
\L在替換字元中使用\L标志時,它會把緊跟在其後面的所有字元當做小寫字元處理
\u在替換字元中使用\u标志時,它會把緊跟在其後面的第一個字元當做大寫字元處理
\U在替換字元中使用\U标志時,它會把緊跟在其後面的所有字元當做小寫字元處理
\E需要和\U或者\L一起使用,它将關閉\U或者\L的功能
6.sed用等号顯示行号
[root@www test]# sed '=' sed.txt
1
2
3
4
5
7.一條sed語句執行多條sed指令
如例1:sed ‘3,$d’ sed.txt |sed ‘s#10#01#g’
例2:sed -e ‘3,$d’ -e ‘s#10#01#g’’ sed.txt
例3:sed ‘3,$d;s#10#01#g’ sed.txt(建議用這種最簡單)
例4:
[root@www test]# cat sed_jiaoben.txt
3,$d
s#10#01#g
[root@www test]# sed -f sed_jiaoben.txt sed.txt
注:該四條指令執行結果相同
企業案例:一個檔案100行,把5,35,70行單獨拿出來
sed -n '5p;35p;70p' sed.txt
8.特殊符号大括号
[root@www test]# sed -n '2,4{p;=}' sed.txt
注:大括号裡的意思是先顯示2-4行,然後在顯示2-4行的行号
9.将2行變為1行
注用N參數後其實是
1\nceo,101,OLDBOY
2\ncto,102,ZHANGYAO
3\ncoo,103,ALEX
4\ncfo,104,YY
5\ncio,105,FEIXUE
然後再将\n替換為空格
[root@www test]# sed '=' sed.txt|sed 'N;s#\n# #'
1 ceo,101,OLDBOY
2 cto,102,ZHANGYAO
3 coo,103,ALEX
4 cfo,104,YY
5 cio,105,FEIXUE
企業案例
1412412
dsnafan
243124
dfafdaf
2134125
adafafa
[root@www test]# sed 'N;s#\n#=#g' sed.txt
1412412=dsnafan
243124=dfafdaf
2134125=adafafa
'
本文轉自 fxl風 51CTO部落格,原文連結:http://blog.51cto.com/fengxiaoli/1947413