Linux之sed


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM