sed是stream editor(流式編輯器)的縮寫,它可以對文本流、指定文件集或標准輸入進行文本編輯。功能非常強大。
sed命令的基本模式是:
sed [-參數] '命令' 文本
1. sed兩大原則
sed命令總是以單個字母開頭。比如
[rte@deldir]$echo "hello123" | sed 's/hello/HELLO/' #把hello用HELLO替換 HELLO123
上例中s是替換命令,s后面是分割符號,啥都行(一般用‘/’),比如上例子與下面命令等價:
[rte@deldir]$echo "hello123" | sed 's*hello*HELLO*' HELLO123
sed多數命令允許在前面加個地址。該地址用於指定輸入流的哪一行被編輯,如果省略,默認是對所有行都進行編輯。例如
[rte@deldir]$cat del2 hello1 hello2 hello hello3 [rte@deldir]$cat del2 | sed '2s/hello/HELLO/' #替換第2行 hello1 HELLO2 hello hello3 [rte@deldir]$cat del2 | sed '2,3s/hello/HELLO/' #替換第2到3行 hello1 HELLO2 hello HELLO3 [rte@deldir]$cat del2 | sed 's/hello/HELLO/' #替換所有行(沒有地址,就是默認) HELLO1 HELLO2 hello HELLO3
2. sed基本編輯命令
命令 | 功能簡稱 | 功能描述 |
i | 前插 | 在當前行的前面插入 |
a | 后插 | 在當前行的后面插入 |
d | 刪 | 刪除當前行 |
p | 查 | 打印當前行。默認是把所有的行都打印出來,並把符合條件的行也打印出來。要是屏蔽默認,加參數-n |
s/regex/replacement/ | 換 | 把regex用replacement替換 |
y/set1/set2 | 換 | 把set1中的字符用對應的set2中的字符替換(必須保證兩個集合的字符個數相等) |
= | 輸出當前行的行號 | |
q | 處理完當前行后退出sed | |
Q | 直接退出sed |
插(i前插,a后插)
[rte@baidu]$cat del 1 2 3 [rte@baidu]$sed '2i mm' del 1 mm 2 3 [rte@baidu]$sed '2a mm' del 1 2 mm 3 [rte@baidu]$sed '2,3i mmm' del 1 mmm 2 mmm 3 [rte@baidu]$sed '2,3a mmm' del 1 2 mmm 3 mmm
刪
[rte@deldir]$cat del2 hello1 hello2 hello hello3 [rte@deldir]$sed '1d' del2 #刪除第一行 hello2 hello hello3 [rte@deldir]$sed '$d' del2 #刪除最后一行 hello1 hello2 hello [rte@deldir]$sed '2,3d' del2 #刪除第2到3行 hello1
查
[rte@deldir]$cat del2 hello1 hello2 hello hello3
[rte@deldir]$sed '2p' del2 #查看第2行,沒有-n參數,原來的數據也會輸出 hello1 hello2 hello hello2 hello hello3
[rte@deldir]$sed -n '2p' del2 #查看第2行 hello2 hello
[rte@deldir]$sed -n '2,$p' del2 #查看2到最后一行 hello2 hello hello3
換——字符串替換
[rte@deldir]$cat del2 hello1 hello2 hello hello3 [rte@deldir]$sed '1,2s/hello/NO/' del2 #第1到2行hello替換成NO(一行只替換一次) NO1 NO2 hello hello3 [rte@deldir]$sed '1,2s/hello/NO/g' del2 #地1到2行的hello全部替換成NO(參數g表示替換全部) NO1 NO2 NO hello3 [rte@deldir]$sed '1,2c NO' del2 #把1到2行用NO替換 NO hello3 [rte@deldir]$sed 's/hello/HELLO/' del2 #把所有行的“hello”替換成“HELLO”,等價與sed '1,$s/hello/HELLO/' del2 HELLO1 HELLO2 hello HELLO3
換——哈希替換
[rte@deldir]$cat del2 hello1 hello2 hello hello3 [rte@deldir]$cat del2 | sed 'y/hel/HEL/' #把‘hel’對應的‘HEL’ HELLo1 HELLo2 HELLo HELLo3
其他
[rte@deldir]$cat del2 hello1 hello2 hello hello3 [rte@deldir]$cat del2 | sed '=' #輸出當前行的行號 1 hello1 2 hello2 hello 3 hello3 [rte@deldir]$cat del2 | sed 'q' #輸出當前行就結束sed hello1 [rte@deldir]$cat del2 | sed 'Q' #立馬結束sed
3. sed常用參數
參數 | 參數含義 |
-n | 安靜模式,不加-n會把輸入流都輸出到終端,加上后只輸出符合條件的 |
-e | 多點 |
-f | -f filename 執行filename文件里的sed命令 |
-i | 直接修改讀取的文件內容(慎重) |
-n
[rte@deldir]$cat del2 | sed '2p' hello1 hello2 hello hello2 hello hello3 [rte@deldir]$cat del2 | sed -n '2p' #只輸出符號條件的行 hello2 hello
-e
[rte@deldir]$cat del2 | sed -e '2p' -e '3p' #多重命令同時 hello1 hello2 hello hello2 hello hello3 hello3 [rte@deldir]$cat del2 | sed -n -e '2p' -e '3p' hello2 hello hello3
-f
[rte@deldir]$cat DEL s/hel/HEL/ 2,$p [rte@deldir]$sed -f DEL del2 #按着DEL文件里的awk命令修改 HELlo1 HELlo2 hello HELlo2 hello HELlo3 HELlo3 [rte@deldir]$sed -n -f DEL del2 HELlo2 hello HELlo3
-i
[rte@deldir]$cat del2 hello1 hello2 hello hello3 [rte@deldir]$sed -i 's/hel/HEL/' del2 #直接修改del2 [rte@deldir]$cat del2 HELlo1 HELlo2 hello HELlo3