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行內容為源文件的最后一行內容(行倒序排序),最后打印出模式空間的內容。
原創文章,作者:苦澀咖啡,如若轉載,請注明出處:http://www.www58058.com/32621