sed-筆記

一.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      刪除1020行(包括第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

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