sed是一種能夠執行與VI相同功能的編輯器,特點如下:不提供交互式的使用方式,只能在命令行輸入命令、指定文件名,並在屏幕上查看輸出;另外它沒有破壞性,不會修改原文件,所有修改在模式空間內部進行,結果打印到屏幕,除非使用shell重定向來保存輸出結果。
1. sed如何工作:
sed逐行處理輸入文件,並將輸出結果發送到屏幕。具體過程:
將當前行讀入到模式空間(一個臨時緩衝區);
在該行上執行命令;
將結果發送到屏幕上(除非取消了缺省打印,或者之前的處理是將行刪除);
將行從模式空間刪除;
讀入輸入的下一行。
sed逐行處理輸入文件,並將輸出結果發送到屏幕。具體過程:
將當前行讀入到模式空間(一個臨時緩衝區);
在該行上執行命令;
將結果發送到屏幕上(除非取消了缺省打印,或者之前的處理是將行刪除);
將行從模式空間刪除;
讀入輸入的下一行。
如果是將多個sed寫入到腳本,則處理過程如下:
將輸入文件中的第一行拷貝到模式空間;
執行腳本中的所有命令;
拷貝下一行到模式空間,執行腳本所有命令,直到處理完全部輸入。
將輸入文件中的第一行拷貝到模式空間;
執行腳本中的所有命令;
拷貝下一行到模式空間,執行腳本所有命令,直到處理完全部輸入。
2. sed命令與選項
2.1 命令格式
sed命令告訴sed對文件中的行做什麼操作,具體操作可以包含打印、刪除、修改等。格式如下:
sed 'command' filename(s)
sed命令告訴sed對文件中的行做什麼操作,具體操作可以包含打印、刪除、修改等。格式如下:
sed 'command' filename(s)
命令command中可以指定地址,如果指定了地址,則根據命令處理地址對應的行;否則sed就會處理輸入的每一行。
地址可以是數字、正則表達式或者兩者的組合,規則如下:
地址如果是一個數字,則表示一個行號;
如果給出的是逗號分隔的2個行號,則表示要處理的地址就是兩行之間的範圍,包括這兩行;
如果給定的是正則表達式,則處理匹配該表達式的所有行;
美元符號$代表輸入文件的最後一行;
範圍可以包含數字、正則表達式、或者兩者的組合。
地址可以是數字、正則表達式或者兩者的組合,規則如下:
地址如果是一個數字,則表示一個行號;
如果給出的是逗號分隔的2個行號,則表示要處理的地址就是兩行之間的範圍,包括這兩行;
如果給定的是正則表達式,則處理匹配該表達式的所有行;
美元符號$代表輸入文件的最後一行;
範圍可以包含數字、正則表達式、或者兩者的組合。
2.2 常用命令和舉例(一)
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:~$
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:~$
gaolu@gaolu-desktop:~$ sed -n '/100/p' datafile
William 100
Lucy 100
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ sed '3d' datafile 刪除第三行
NAME SCORE
William 100
Jim 80
Lucy 100
gaolu@gaolu-desktop:~$
缺省情況下,其他行都被直接打印到屏幕。
NAME SCORE
William 100
Jim 80
Lucy 100
gaolu@gaolu-desktop:~$
缺省情況下,其他行都被直接打印到屏幕。
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.
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:~$
關閉缺省打印,只打印發生替換的行。
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
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
如果需要表示“與”符號字面含義,需要使用轉義字符。
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.
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 '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:~$
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:~$
這裏需要注意的是多重命令都是在模式空間的當前行上面進行,命令之間的前後順序不同可能會影響到編輯的結果。
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
-----------------------------------------
NAME SCORE
William 100
-----------------------------------------
william is no 1
-----------------------------------------
要睡覺了,先總結到此,後面sed的其他命令比較多,也比這裏列出的要複雜一些。比如關於模式空間的H,h、暫存緩衝區的G,g、寫文件、追加、插入、交換、n命令以及!等等。後面再看看簡單的腳本編程。