一.sed腳本編程的方法論
1. 在着手做之前要弄清楚想做什麼。
2. 明確地描述處理的過程。
3. 在提交最終的改變之前反覆測試這個過程。
注1:檢測腳本最好的方式,是使用不同的輸入樣本進行測試並觀察結果。
二.sed 的工作方式(原理)
sed 命令按順序逐行將文件讀入到內存中。它一次處理一行內容,以行爲單位。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。期間還可以使用hold space的內存緩衝空間作爲二級緩衝處理。默認輸出是將每一行的內容輸出到屏幕上(標準輸出)。
其中兩個重要的因素:第一,輸出可以被重定向到另一文件中,以保存變化;第二,源文件(默認地)保持不被修改。sed 默認讀取整個文件並對其中的每一行進行修改。不過,可以按需要將操作限制在指定的行上。
三.命令語法
sed [options] '{command}' [filename]
1. 選項與參數:[-nefri]
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 數據一般都會被列出到螢幕上。但如果加上 -n 參數後,則只有經過sed 特殊處理的那一行(或者動作)纔會被列出來。
-e :直接在命令列模式上進行 sed 的動作編輯;
-f : 直接將 sed 的動作寫在一個文件內, -f filename 則可以運行 filename 內sed 動作;
-r :sed 的動作支持的是延伸型正規表示法的語法。(默認是基礎正規表示法語法)
-i :直接修改讀取的文件內容,而不是由螢幕輸出。
2. 命令說明:
sed '[address]function'
首先地址是可選的,地址範圍(address)可以用:
無 表示所有行,命令應用於每一行。
例:d 刪除所有行。
n1 數字構成,單個數字(n1)表示單獨的一行。
例:1d 刪除第一行。
n1,[n2] 用逗號分隔( n1,[n2] )的兩個行數表示以這兩行爲起止的行的範圍。
例:10,20d 刪除10到20行(包括第10和第20行)。
10,d 刪除10行以上的所有行。
$ 尋址符號($)表示待處理文本的最後一行,與正則表達式中$(單個行結尾) 不同。
例:$d 刪除最後一行。
! 地址後跟 “!” 表示命令匹配該地址以外的所有行。
例:10!d 刪除除了第10行以外的所有行。
RE 正則表達式作爲地址提供,命令隻影響與正則表達式匹配的行,正則表達式 必須封閉在斜槓”/“
例:/^$/d 刪除所有空行。
常用動作有:
a :新增,a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)。
例:sed '2a string' filename
c :取代,c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
例:sed '2c string' filename
d :刪除,d 後面通常不接任何字符;
例:sed '2d' filename
i :插入,i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行).
例:sed '2i' filename
p :打印/列出,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行。
例:sed '2p' filename
r : 從文件中讀取,後面接文件名稱,一個腳本最多打開10個文件,文件不存在命令不會報錯。
格式爲:[line-address]r file //操作單行,不能處理範圍內的行。
例:sed '/test/r filename1' filename2 //filename1的內容被讀取出來,顯示在匹配的與test匹配的行的後面。
w : 將模式空間中內容寫到文件中,追加到文件中,不存在則創建。
格式爲:[address]w file //對行沒有限制,單行,多行都可以處理。
l : 列表命令用於顯示模式空間的內容,將非打印的字符顯示爲兩個數字的ASCII代碼。其功能類似於vi 中的列表命令(:l)
例:sed -n l filename
y: 轉換命令是特有的,按位置將字符串中abc每個字符,都轉換爲xyz中的等價字符,在該地址範圍內的所有的a 都被替換成了 x ,而不管它後面有沒有b。
格式爲:[address]y/abc/xyz/
例:sed y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ
s :替換,可以直接進行取代,通常這個 s 的動作可以搭配。
例:sed 's/old-value/new-value/g' filename
說明:將”old-value”字符替爲”new-value”字符
詳細用法:
[address]s/pattern/replacement/flags
flags是:
n 1-512之間的一個數字,表示文本模式中指定模式第n次出現的情況進行替換。
#cat quanju
1hang-1hang-1hang
2hang-2hang-2hang
例:sed ‘s/hang/@/2’ quanju
1hang-1@-1hang
2hang-2@-2hang
說明:替換每一行中第2個匹配的字符串。
g 對模式空間的所有出現的情況進行全局更改。而沒有g通常只有第一次出現的情況被替換。
例:sed ‘s/hang/@/g’ quanju
1@-1@-1@
2@-2@-2@
p (小寫p)打印模式空間的內容。
w (小寫w)file 將模式空間的內容寫到文件file中。
3. 命令行上3種方式書寫多重指令
a) 分號分隔方式;
例: sed 's/old1/new1/; s/old2/new2/; s/old3/new3/' filename
b) 每個指令前加 -e 參數;
例: sed -e 's/old1/new1/' -e 's/old2/new2/' filename
c) bourne shell的分行指令功能;
單引號後RETURN,出現多行輸入提示符(>).
說明:
Csh中不能使用,Csh中每個指令結尾使用分號,使用反斜槓(\)作爲每一行的結束。
於Bourne shell兼容的shell,如:ksh,bash,pdks,zsh則可以使用(' " ( { \)進行分行指令。
例1:# sed '
> s/old1/new1/
> s/old2/new2/
> s/old3/new3/' filename