sed命令應用詳解

sed應用詳解

sed是文本處理處理工具“三大劍客”之一,它 是一種流編輯器,sed一次只處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。sed不會修改原文件內容,除非你使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件,簡化對文件的反覆操作,編寫轉換程序等。

 用法:sed [OPTION]... {script-only-if-no-other-script} [input-file]...

sed可依照script來處理文本文件,skript又包含地址定界和編輯命令。地址定界是指定要處理的文件範圍,比如只處理文件的前十行內容,或者只處理文件的奇數行等,編輯命令是指對指定範圍的內容進行怎樣的處理,比如在屏幕上打印顯示,或者刪除、替換等操作,地址定界和編輯命令必須配合使用,如果不指定地址定界則默認對全文進行處理。sed本身也有選項參數,常用的選項參數如下所示:

-n:僅顯示經過script處理後的結果,默認情況下,sed會自動打印模式空間的內容

-e:可以指定多個script同時處理

-f /path/to/script_file:從指定的文件中讀取腳本並運行

-r:支持使用擴展正則表達式

-i:直接修改源文件

script地址定界的方式有:

(1)若不指定範圍則表示處理全文

(2)#:#代表數字,指定行號

(3)/pattern/:模式匹配,被/pattern/匹配到的所有行

(4)#1,#2:表示從第#1行到第#2行之間所有的行

(5)#,+n:表示從第#行開始再向下n行之間的所有行

(6)/pat1/,/pat2/:表示從第一次被/pat1/匹配到的行開始,到第一次被/pat2/匹配到的行結束,中間所有的行

(7)#,/pat1/:表示從第#行開始,到第一次被/pat1/匹配到的行結束,之間所有的行

(8)first~step:表示指定起始行以及步長,比如1~2,1代表起始行,2代表步長,匹配到的行即爲1,3,5,7...(奇數行)

(9)$:表示最後一行

script編輯命令有:

d:刪除模式空間中的行

[root@fengl testdir]# cat test     #先查看test原文件內容
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff
[root@fengl testdir]# sed '1d' test   #刪除第1行
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

p:打印模式空間中的行

[root@fengl testdir]# sed -n '/aaa/p' test     #只打印匹配“aaa”的行
1aaaaaaaaaaaaaaaa

a \text:在當前行下面追加文本,支持使用\n實現多行追加

[root@fengl testdir]# sed '1,3a\ggggggggg' test   #在1至3行下面插入“ggggggggg”
1aaaaaaaaaaaaaaaa
ggggggggg
2bbbbbbbbbbbbbbbb
ggggggggg
3cccccccccccccccc
ggggggggg
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

i \text:在當前行下面插入文本,支持使用\n實現多行插入

[root@fengl testdir]# sed '2,+2i\ggggggggg' test      #在從第2行開始向下2行的上面插入“ggggggggg”
1aaaaaaaaaaaaaaaa
ggggggggg
2bbbbbbbbbbbbbbbb
ggggggggg
3cccccccccccccccc
ggggggggg
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

c \text:把選定的行改爲新的文本

[root@fengl testdir]# sed '/a/,/c/c\ggggggggg' test    #將第一次匹配到的‘a’所在行至‘c’所在行之間的所有內容更改爲“ggggggggg”
ggggggggg
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

=:爲模式空間中的行打印行號

[root@fengl testdir]# sed -n '3,/f/=' test  #只顯示從第3行開始到第一次匹配到“f”所在行之間的所有行的行號
3
4
5
6

s/regexp/replacement/:查找替換,替換由regexp所匹配到的內容爲replacement,支持使用其他分隔符,條件是該分隔符在後面的模式中沒有出現過,如s@@@或s###,對於替換還有後選項,如下:

    g:全局替換

    p:顯示替換成功的行

    i:不區分大小寫

[root@fengl testdir]# sed '1~2s/e/g/' test  #將奇數行中匹配到的第一個“e”替換成“g”
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd
5geeeeeeeeeeeeeee
6ffffffffffffffff
[root@fengl testdir]# sed '1~2s/e/g/g' test #將奇數行中所有匹配到的“e”替換成“g”
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd
5gggggggggggggggg
6ffffffffffffffff
[root@fengl testdir]# sed -n '1~2s/e/g/p' test   #將奇數行中所有匹配到的“e”替換成“g”,並只顯示替換的行
5geeeeeeeeeeeeeee

w/path/to/somefile:把指定的內容另存至/path/to/somefile路徑所指定的文件中

[root@fengl testdir]# sed -n '1,4w/testdir/testsave' test    #將test文件中的1至4行內容另存到/testdir/目錄下的testsave文件中
[root@fengl testdir]# cat testsave    #查看testsave文件
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd

r/path/form/somefile:在文件的指定位置插入另一個文件的所有內容,完成文件合併

[root@fengl testdir]# sed '3r/testdir/text' test   #將/testdir/text文件中的內容插入到test文件的第3行下面
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
hhhhhhhhhhhhh
iiiiiiiiiiiii
jjjjjjjjjjjjj
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff


sed除了“模式空間”(pattern space)外,還有一個保持空間“hold space”。sed工作機制是每次讀取一行文本至模式空間中, 在模式空間中完成處理,將處理結果輸出值標準輸出設備,在模式空間中處理一行內容後悔繼續處理下一行,那麼對於處理過的行可能還有其他的處理,因此可以先把處理過的行“傳送”至保持空間中,然後在後續的處理中再次“傳送”回模式空間中。

sed工具支持一些高級的命令運用到保持空間中,這些高級命令有:

h:用模式空間中的內容覆蓋保持空間的內容

H:把模式空間中的內容追加至保持空間中

g:從保持空間中取出數據覆蓋至模式空間

G:從保持空間中取出數據追加至模式空間

x:交換保持空間和模式空間的內容

n:讀取匹配到的行的下一行覆蓋至模式空間

N:讀取匹配到的行的下一行追加至模式空間

d:刪除模式空間中的內容

D:刪除多行模式空間中的首行

注意:

!:取反,表示後面的命令對所有沒有被選定的行發生作用

;:分號可用於分割腳本


示例1:

[root@fengl testdir]# sed -n 'n;p' test
2bbbbbbbbbbbbbbbb
4dddddddddddddddd
6ffffffffffffffff

sed的處理步驟爲:

(1)因爲n表示讀取匹配到的行的下一行到模式空間中,因此第一次讀取第1行時的動作是將第2行的內容覆蓋至模式空間中,此時模式空間中的內容是第2行內容

(2)緊接着執行p操作,即打印模式空間的行(打印第2行內容)

(3)然後重複執行以上操作,繼續讀取下一行(即第3行,因爲第2行已經讀取過了),並將其下一行覆蓋至模式空間(即模式空間的內容是第4行內容),然後再執行p操作(打印第4行內容),依次類推,直至文件讀取完畢後結束sed運行


實例2:

[root@fengl testdir]# sed '1!G;h;$!d' test
6ffffffffffffffff
5eeeeeeeeeeeeeeee
4dddddddddddddddd
3cccccccccccccccc
2bbbbbbbbbbbbbbbb
1aaaaaaaaaaaaaaaa

sed的處理步驟爲:

(1)讀取文件的第一行內容到模式空間,因爲第一行不執行G操作

(2)執行h操作,將模式空間的內容覆蓋至保持空間

(3)因爲不是最後一行,因此執行d操作,刪錯模式空間中的內容。此時模式空間內容爲空,保持空間爲第一行內容

(4)緊接着執行第2次循環,讀取第2行內容,並執行G操作,將保持空間的內容追加至模式空間。此時模式空間爲第2行和第1行內容,保持空間爲第1行內容

(5)繼續執行h操作,再把模式空間的內容覆蓋至保持空間,因爲第2行不是最後一行,然後在執行d操作,刪除模式空間的內容。此時模式空間爲空,保持空間爲第2行和第1行內容(第1行內容在第2行下面)

(6)依次循環至文件最後一行,不執行d操作,此時模式空間的第1行內容爲源文件的最後一行內容(行倒序排序),最後打印出模式空間的內容。

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