Linux三劍客之SED

這裏寫圖片描述

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章