sed簡介(一)

sed是一種能夠執行與VI相同功能的編輯器,特點如下:不提供交互式的使用方式,只能在命令行輸入命令、指定文件名,並在屏幕上查看輸出;另外它沒有破壞性,不會修改原文件,所有修改在模式空間內部進行,結果打印到屏幕,除非使用shell重定向來保存輸出結果。
 
1. sed如何工作:
sed逐行處理輸入文件,並將輸出結果發送到屏幕。具體過程:
將當前行讀入到模式空間(一個臨時緩衝區);
在該行上執行命令;
將結果發送到屏幕上(除非取消了缺省打印,或者之前的處理是將行刪除);
將行從模式空間刪除;
讀入輸入的下一行。
 
如果是將多個sed寫入到腳本,則處理過程如下:
將輸入文件中的第一行拷貝到模式空間;
執行腳本中的所有命令;
拷貝下一行到模式空間,執行腳本所有命令,直到處理完全部輸入。

2. sed命令與選項
 
2.1 命令格式
sed命令告訴sed對文件中的行做什麼操作,具體操作可以包含打印、刪除、修改等。格式如下:
     sed 'command' filename(s)
 
命令command中可以指定地址,如果指定了地址,則根據命令處理地址對應的行;否則sed就會處理輸入的每一行。
地址可以是數字、正則表達式或者兩者的組合,規則如下:
地址如果是一個數字,則表示一個行號;
如果給出的是逗號分隔的2個行號,則表示要處理的地址就是兩行之間的範圍,包括這兩行;
如果給定的是正則表達式,則處理匹配該表達式的所有行;
美元符號$代表輸入文件的最後一行;
範圍可以包含數字、正則表達式、或者兩者的組合。
 
2.2 常用命令和舉例(一)

(1) 打印命令:p
gaolu@gaolu-desktop:~$ cat datafile
NAME      SCORE   
William    100
Suan       90
Jim        80
Lucy       100
 
gaolu@gaolu-desktop:~$ sed '/100/p' datafile  打印包含模式100的行
NAME      SCORE   
William    100
William    100
Suan       90
Jim        80
Lucy       100
Lucy       100
gaolu@gaolu-desktop:~$
 
缺省情況下,sed會將所有行打印到標準輸出上。對於匹配到模式100的行,sed會另外將其打印一次。使用選項-n可以關閉缺省打印:
gaolu@gaolu-desktop:~$ sed -n '/100/p' datafile
William    100
Lucy       100
gaolu@gaolu-desktop:~$
 
(2)刪除命令:d
gaolu@gaolu-desktop:~$ cat datafile
NAME      SCORE   
William    100
Suan       90
Jim        80
Lucy       100
 
gaolu@gaolu-desktop:~$ sed '3d' datafile  刪除第三行
NAME      SCORE   
William    100
Jim        80
Lucy       100
gaolu@gaolu-desktop:~$
缺省情況下,其他行都被直接打印到屏幕。
 
gaolu@gaolu-desktop:~$ sed '3,$d' datafile  刪除第三行到最後一行
NAME      SCORE   
William    100
gaolu@gaolu-desktop:~$

(3)替換命令:s
gaolu@gaolu-desktop:~$ cat datafile
NAME      SCORE   
William    100
Suan       90
Jim        80
Lucy       100
 
gaolu@gaolu-desktop:~$ sed 's/100/good/g' datafile
NAME      SCORE   
William    good
Suan       90
Jim        80
Lucy       good
gaolu@gaolu-desktop:~$
說明:g表示在行內進行全局替換,即如果行裏面出現多個100,則全部替換爲good;否則只講第一個100替換爲good.
 
gaolu@gaolu-desktop:~$ sed -n 's/100/good/gp' datafile
William    good
Lucy       good
gaolu@gaolu-desktop:~$
關閉缺省打印,只打印發生替換的行。
 
gaolu@gaolu-desktop:~$ cat datafile
NAME      SCORE   
William    100
Suan       90
Jim        80
Lucy       100
Tom        9
gaolu@gaolu-desktop:~$ sed 's/[0-9][0-9]$/&.5/' datafile 
&用在s命令的替換串中時,用於代表查找串中匹配的內容。即有2個數字結尾的行,數字後+。5
如果需要表示“與”符號字面含義,需要使用轉義字符。
NAME      SCORE   
William    100.5
Suan       90.5
Jim        80.5
Lucy       100.5
Tom        9
gaolu@gaolu-desktop:~$
 
gaolu@gaolu-desktop:~$ sed 's/\(NAME\)/ENGLISH_\1/' datafile
ENGLISH_NAME      SCORE   
William    100
Suan       90
Jim        80
Lucy       100
Tom        9
gaolu@gaolu-desktop:~$
元字符\(..\)用括進的模式作爲標籤1保存在特殊寄存器中,此後可以使用\1來引用它。做多可以定義9個標籤。
這裏NAME---------->\1,而替換NAME的是ENGLISH_NAME.
 
(4)指定行範圍:逗號
gaolu@gaolu-desktop:~$ sed -n '3,/Lucy/p' datafile  打印從第三行開始,到包含模式Lucy的行
Suan       90
Jim        80
Lucy       100
 
gaolu@gaolu-desktop:~$ sed -n '/Lucy/,3p' datafile   打印從包含模式Lucy的行開始,到第三行,由於模式Lucy已經處於第五行,這裏只打印第五行
Lucy       100
gaolu@gaolu-desktop:~$

gaolu@gaolu-desktop:~$ sed -n '/Lucy/,/William/p' datafile
Lucy       100
Tom        9
gaolu@gaolu-desktop:~$
打印從包含模式Lucy的行開始,到包含模式William的行。如果模式William先出現,打印從模式Lucy所在行開始,到下一個包含模式William的行。如果後面沒有,則打印到文件末尾。
 
(5)多重編輯:e命令
gaolu@gaolu-desktop:~$ sed -e '2d' -e 's/Tom/tom/' datafile
NAME      SCORE   
Suan       90
Jim        80
Lucy       100
tom        9
gaolu@gaolu-desktop:~$
這裏需要注意的是多重命令都是在模式空間的當前行上面進行,命令之間的前後順序不同可能會影響到編輯的結果。

(6)讀文件:r命令
gaolu@gaolu-desktop:~$ cat newfile
-----------------------------------------
                                       
       william is no 1       
-----------------------------------------
gaolu@gaolu-desktop:~$ sed '/William/r newfile' datafile  在所有包含模式William的行後面,都讀入文件newfile的內容
NAME      SCORE   
William    100
-----------------------------------------
                                       
       william is no 1       
-----------------------------------------
Suan       90
Jim        80
Lucy       100
Tom        9
gaolu@gaolu-desktop:~$
要睡覺了,先總結到此,後面sed的其他命令比較多,也比這裏列出的要複雜一些。比如關於模式空間的H,h、暫存緩衝區的G,g、寫文件、追加、插入、交換、n命令以及!等等。後面再看看簡單的腳本編程。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章