sed用法實例

Sed 命令列可分成編輯指令與文件檔部份。其中 , 編輯指令負責控制所有的編輯工作 ; 文件檔表示所處理的檔案。

sed 的編輯指令均由位址(address)與函數(function)兩部份組成 , 其中 , 在執行時 , sed 利用它的位址參數來

決定編輯的對象;而用它的函數參數(解[3])編輯。

此外 , sed 編輯指令 , 除了可在命令列上執行 , 也可在檔案內執行。其中差別只是在命令列上執行時 , 其前必

須加上選項 -e ; 而在檔案(解[4])內時 , 則只需在其檔名前加上選項 -f。另外 , sed 執行編輯指令是依照它

們在命令列上或檔內的次序。

下面各節 , 將介紹執行命令列上的編輯指令、sed 編輯指令、執行檔案內的編輯指令、執行多個檔案的編輯、及

執行 sed 輸出控制。

2.1 執行命令列上的編輯指令

2.2 sed 編輯指令

2.3 執行檔案內的編輯指令

2.4 執行多個檔案的編輯

2.5 執行 sed 輸出控制

2.1.執行命令列上的編輯指令

當編輯指令(參照[section 2.2])在命令列上執行時 , 其前必須加上選項 -e 。其命令格式如下 :

sed -e ‘編輯指令1′ -e ‘編輯指令2′ … 文件檔

其中 , 所有編輯指令都緊接在選項 -e 之後 , 並置於兩個 ” ‘ ” 特殊字元間。另外 , 命令上編輯指令的執行是由

左而右。

一般編輯指令不多時 , 使用者通常直接在命令上執行它們。例如 , 刪除 yel.dat 內 1 至 10 行資料 , 並將其

餘文字中的 “yellow” 字串改成 “black” 字串。此時 , 可將編輯指令直接在命令上執行 , 其命令如下 :

sed -e ’1,10d’ -e ‘s/yellow/black/g’ yel.dat

在命令中 , 編輯指令 ’1,10d’(解[5])執行刪除 1 至 10 行資料 ; 編輯指令 ‘s/yellow/black/g’(解[6]) ,

“yellow” 字串替換(substuite)成 “black” 字串。

2.2 sed 的編輯指令

sed 編輯指令的格式如下 :

[address1[,address2]]function[argument]

其中 , 位址參數 address1 、address2 爲行數或 regular expression 字串 , 表示所執行編輯的資料行 ; 函數參

數 function[argument] 爲 sed 的內定函數 , 表示執行的編輯動作。

下面兩小節 , 將仔細介紹位址參數的表示法與有哪些函數參數供選擇。

2.2.1 位址(address)參數的表示法

實際上 , 位址參數表示法只是將要編輯的資料行 , 用它們的行數或其中的字串來代替表示它們。下面舉幾個例子

說明(指令都以函數參數 d(參照[section4.2]) 爲例) :

刪除檔內第 10 行資料 , 則指令爲 10d。

刪除含有 “man” 字串的資料行時 , 則指令爲 /man/d。

刪除檔內第 10 行到第 200 行資料, 則指令爲 10,200d。

刪除檔內第 10 行到含 “man” 字串的資料行 , 則指令爲 10,/man/d。

接下來 , 以位址參數的內容與其個數兩點 , 完整說明指令中位址參數的表示法(同樣也以函數參數 d 爲例)。

位址參數的內容:

位址爲十進位數字 : 此數字表示行數。當指令執行時 , 將對符合此行數的資料執行函數參數指示的編輯動作。例如 ,

刪除資料檔中的第 15 行資料 , 則指令爲 15d(參照[section4.2])。其餘類推 ,如刪除資料檔中的第 m 行資料 , 則

指令爲 md 。

位址爲 regular expression(參照[附錄 A]):

當資料行中有符合 regular expression 所表示的字串時 , 則執行函數參數指示的編輯動作。另外 , 在

regular expression 前後必須加上 “/”。例如指令爲 /t.*t/d , 表示刪除所有含兩 “t” 字母的資料行。其中 , “.”

表示任意字元; “*” 表示其前字元可重任意次 , 它們結合 “.*” 表示兩 “t” 字母間的任意字串。

位址參數的個數 : 在指令中 , 當沒有位址參數時 , 表示全部資料行執行函數參數所指示的編輯動作; 當只有一位址

參數時 , 表示只有符合位址的資料行才編輯 ; 當有兩個位址參數 , 如 address1,address2 時 , 表示對資料區執行

編輯 , address1 代表起始資料行 , address2 代表結束資料行。對於上述內容 , 以下面例子做具說明。

例如指令爲

d

其表示刪除檔內所有資料行。

例如指令爲

5d

其表示刪除檔內第五行資料。

例如指令爲

1,/apple/d

其表示刪除資料區 , 由檔內第一行至內有 “apple” 字串的資料行。

例如指令爲

/apple/,/orange/d

其表示刪除資料區 , 由檔內含有 “apple” 字串至含有 “orange” 字串的資料行

2.2.2 有那些函數(function)參數

下頁表中介紹所有 sed 的函數參數(參照[chapter 4])的功能。

函數參數 功能

: label 建立 script file 內指令互相參考的位置。

# 建立解

{ } 集合有相同位址參數的指令。

! 不執行函數參數。

= 印出資料行數( line number )。

a 添加使用者輸入的資料。

b label 將執行的指令跳至由 : 建立的參考位置。

c 以使用者輸入的資料取代資料。

d 刪除資料。

D 刪除 pattern space 內第一個 newline 字母 前的資料。

g 拷貝資料從 hold space。

G 添加資料從 hold space 至 pattern space 。

h 拷貝資料從 pattern space 至 hold space 。

H 添加資料從 pattern space 至 hold space 。

l 印出 l 資料中的 nonprinting character 用 ASCII 碼。

i 插入添加使用者輸入的資料行。

n 讀入下一筆資料。

N 添加下一筆資料到 pattern space。

p 印出資料。

P 印出 pattern space 內第一個 newline 字母 前的資料。

q 跳出 sed 編輯。

r 讀入它檔內容。

s 替換字串。

t label 先執行一替換的編輯指令 , 如果替換成牛p>則將編輯指令跳至 : label 處執行。

w 寫資料到它檔內。

x 交換 hold space 與 pattern space 內容。

y 轉換(transform)字元。

雖然 , sed 只有上表所述幾個擁有基本編輯功能的函數 , 但由指令中位址參數和指令與指令間的配合 , 也能使

sed 完成大部份的編輯任務。

2.3 執行檔案內的編輯指令

當執行的指令太多 , 在命令列上撰寫起來十分混亂 , 此時 , 可將這些指令整理儲存在檔案

(譬如檔名爲 script_file )內 , 用選項 -f script_file , 則讓 sed 執行 script_file 內的編輯指令。其命

令的格示如下 :

sed -f script_file 文件檔

其中 , 執行 script_file 內編輯指令的順序是由上而下。例如上一節的例子 , 其可改成如下命令:

sed -f ysb.scr yel.dat

其中 , ysb.scr 檔的內容如下 :

1,10d

s/yellow/black/g

另外 , 在命令列上可混合使用選項 -e 與 -f , sed 執行指令順序依然是由命令列的左到右, 如執行至 -f 後

檔案內的指令 , 則由上而下執行。

2.4 執行多個文件檔的編輯

在 sed 命令列上 , 一次可執行編輯多個文件檔 , 它們跟在編輯指令之後。例如 , 替換

white.dat、red.dat、black.dat 檔內的 “yellow” 字串成 “blue” , 其命令如下:

sed -e ‘s/yellow/blue/g’ white.dat red.dat black.dat

上述命令執行時 , sed 依 white.dat、red.dat、black.dat 順序 , 執行編輯指令 s/yellow/blue/(請參照[section 4.1] ,

進行字串的替換。

2.5.執行輸出的控制

在命令列上的選項 -n (解[7]) 表示輸出由編輯指令控制。由前章內容得知 , sed 會 “自動的” 將資料由

pattern space 輸送到標準輸出檔。但藉着選項 -n , 可將 sed 這 “自動的” 的動作改成 “被動的” 由它所執行的

編輯指令(解[8])來決定結果是否輸出。

由上述可知 , 選項 -n 必須與編輯指令一起配合 , 否則無法獲得結果。例如 , 印出 white.dat 檔內含有 “white”

字串的資料行 , 其命令如下:

sed -n -e ‘/white/p’ white.dat

上面命令中 , 選項 -n 與編輯指令 /white/p (參照[section4.6]) 一起配合控制輸出。其中 , 選項 -n 將輸出控制權

移給編輯指令;/white/p 將資料行中含有 “white” 字串印出螢幕。

源文檔 <http://doc.linuxpk.com/351.html>

====================================================================================>

1. 打印:p

[root@TestAs4 chap04]# cat datafile 原文件

[root@TestAs4 chap04]# sed -n ‘/north/p’ datafile 取消默認輸出 只打印包含模板的行

[root@TestAs4 chap04]# sed ‘/north/p’ datafile 打印包含模板的行及打印默認輸出

2. 刪除:d

[root@TestAs4 chap04]# sed ’3d’ datafile 刪除第三行

[root@TestAs4 chap04]# sed ’3,$d’ datafile 刪除第三行到最後的所有行

[root@TestAs4 chap04]# sed ‘/north/d’ datafile 刪除所有包含模板north的行

3. 選定行的範圍:逗號

[root@TestAs4 chap04]# sed -n ‘/west/,/east/p’ datafile 所有在模板west和east所確定的行都被打印

[root@TestAs4 chap04]# sed -n ’1,5′p datafile 打印第一、五行的內容

[root@TestAs4 chap04]# sed ‘/west/,/east/s/$/**?VACA**/’ datafile 對於east和west之間的行,末尾用**?VACA**替換

[root@TestAs4 chap04]# sed -n ‘/west/,/south/p’ datafile

4.多點編輯:e命令

[root@TestAs4 chap04]# sed -e ’1,3d’ -e ‘s/Hemenway/Jones/’ datafile 刪除1到3行,用Hemenway替換Jones

5. 從文件讀入:r 命令

[root@TestAs4 chap04]# cat newfile

nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

| ***SUAN HAS LEFT THE COMPANY*** |

|_________________________________|

[root@TestAs4 chap04]# sed ‘/Suan/r newfile’ datafile 把newfile文件內容放到Suan行的下面

注:如果不止一個Suan 則newfile的內容就將顯示在所有匹配行的下面

6. 寫入文件:w命令

[root@TestAs4 chap04]# sed -n ‘/north/w newfile2′ datafile 命令w表示把所有包含north的行寫入到newfile2

[root@TestAs4 chap04]# cat newfile2

7. 追加:a 命令

[root@TestAs4 chap04]# sed ‘/^north/a —->THE NORTH SALES DISTRICT HAS MOVED

northwest NW Charles Main 3.0 .98 3 34

—->THE NORTH SALES DISTRICT HAS MOVED

western WE Sharon Gray 5.3 .97 5 23

southwest SW Lewis Dalsass 2.7 .8 2 18

southern SO Suan Chin 5.1 .95 4 15

southeast SE Patricia Hemenway 4.0 .7 4 17

eastern EA TB Savage 4.4 .84 5 20

northeast NE AM Main Jr. 5.1 .94 3 13

—->THE NORTH SALES DISTRICT HAS MOVED

north NO Margot Weber 4.5 .89 5 9

—->THE NORTH SALES DISTRICT HAS MOVED

central CT Ann Stephens 5.7 .94 5 13

注:在出現首個單詞是north的後一行追加—->THE NORTH SALES DISTRICT HAS MOVED行

8. 插入: i 命令

[root@TestAs4 chap04]# sed ‘/eastern/i\

> NEW ENGLAND REGION\

> ————————————-’ datafile

northwest NW Charles Main 3.0 .98 3 34

western WE Sharon Gray 5.3 .97 5 23

southwest SW Lewis Dalsass 2.7 .8 2 18

southern SO Suan Chin 5.1 .95 4 15

southeast SE Patricia Hemenway 4.0 .7 4 17

NEW ENGLAND REGION

————————————-

eastern EA TB Savage 4.4 .84 5 20

northeast NE AM Main Jr. 5.1 .94 3 13

north NO Margot Weber 4.5 .89 5 9

central CT Ann Stephens 5.7 .94 5 13

注:如果模板eastern被匹配,i命令把反斜槓後面的文本插入到包含eastern的行的前面

9. 替換:s 命令

[root@TestAs4 oracle]# pwd

/u01/app/oracle

[root@TestAs4 oracle]# pwd | sed ‘s/\/[^\/]*$/old/’ 把“/ u01/app/oracle”的 “/oracle”替換爲old

/u01/appold

[root@TestAs4 chap04]# sed -n ‘s/Hemenway/Jones/pg’ datafile 所有的Hemenway行被Jones 替換並打印

southeast SE Patricia Jones 4.0 .7 4 17


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