SED手冊

來源:本站原創 Linux 超過1,053 views圍觀 0條評論

第一章、介紹

Sed(Stream EDitor)是Unix系統上提供的將編輯工作自動化的編輯器,使用者無需直接編輯數據。使用者可利用sed所提供的20多種不同的函數參數,組合(注釋[1])它們完成不同的編輯動作。此外,由于sed都以行為單位編輯文件,故它是行編輯器(line editor)。

一般sed最常用在編輯那些需要不斷重復某些編輯動作的文件上,例如將文件中的某個字符串替換成另一個字符串等等。這些相較于一般Unix編輯器(交談式的,如vi、emacs)用手動的方式修改文件,sed用起來較省力。下面幾節將分別介紹:

何時使用sed

何處獲得sed

sed能做哪些編輯動作

sed如何工作

1.1 何時使用sed

在修改文件時,如果不斷地重復某些編輯動作,則可用sed自動一次執行這些編輯動作。例如要使received文件內1000封電子信件內的發信人屬名"Tom"改成"John",此時只要在命令行上執行一簡單的sed命令就可把文件內所有的"Tom" 字符串替換成"John"。

此外,當文件需要許多不同編輯動作時,則sed一次可執行那些不同的編輯動作。例如sed能一次執行完將文件中所有空白行刪除、替換字符串、并將使用者輸入的文字添加在文件的第6行等等不同的編輯動作。

1.2 何處獲得sed

一般的Unix系統,本身即附有sed。不同的Unix系統所附的sed版本亦不盡相同。如果讀者使用的Unix系統上沒有sed,則可通過匿名ftp到下列地方去取得:

phi.sinica.edu.tw:/pub/GNU/gnu

gete.sinica.edu.tw:/unix/gnu

ftp.edu.tw:/UNIX/gnu

ftp.csie.nctu.edu.tw:/pub/Unix/GNU

ftp.fcu.edu.tw:/pub3/UNIX/gnu

axp350.ncu.edu.tw:/Packages/gnu

leica.ccu.edu.tw:/pub2/gnu

mail.ncku.edu.tw:/pub/unix/gnu

bbs.ccit.edu.tw:/pub1/UNIX/gnu

prep.ai.mit.edu.tw:/pub/gnu

1.3 sed能做哪些編輯動作

sed可刪除(delete)、改變(change)、添加(append)、插入(insert)、合并、交換文件中的數據行,或讀入其它文件的數據到文件中,也可替換(substuite)它們其中的字符串、或轉換(tranfer)其中的字母等等。例如將文件中的連續空白行刪成一行、"local"字符串替換成"remote"、"t"字母轉換成"T"、將第10行數據與第11數據合并等。

1.4 sed如何工作

如同其它Unix命令,sed由標準輸入讀入編輯文件并由標準輸出送出結果。下圖表示sed將數據行"Unix"替換成"UNIX",在圖中,上方standard input為標準輸入,是讀取數據之處;standard output為標準輸出,是送出結果之處;中間sed方塊的下面兩個虛線方塊表示sed的工作流程。其中,左邊虛線方塊表示sed將標準輸入數據置入pattern space,右邊虛線方塊表示sed將pattern space中編輯完畢后的數據送到標準輸出。

在虛線方塊中,兩個實線方塊分別表示pattern space與sed script。其中,pattern space為一緩沖區,它是sed工作場所;而sed script則表示一組執行的編輯指令。

在圖中,左邊虛線方塊"Unix"由標準輸入置入pattern space;接著,在右邊虛線方塊中,sed執行sed script中的編輯指令s/Unix/UNIX/(注釋[2]),結果"Unix"被替換成"UNIX",之后,"UNIX"由pattern space送到標準輸出。

綜上所述,當sed由標準輸入讀入一行數據并放入pattern space時,sed依照sed script的編輯指令逐一對pattern space內的數據執行編輯,之后,再將pattern space內的結果送到標準輸出,接著再將下一行數據讀入。如此重復執行上述動作,直至讀完所有數據行為止。

第二章、使用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的函數參數(參照[chapter4])的功能。

函數參數 功能

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

# 建立注釋。

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

! 不執行函數參數。

= 打印數據行數(line number)。

a\ 添加使用者輸入的數據。

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

c\ 以使用者輸入的數據取代數據。

d 刪除數據。

D 刪除pattern space內第一個newline字母前的數據。

g 將hold space的數據拷貝到pattern space。

G 將hold space的數據添加到pattern space。

h 將pattern space的數據拷貝到hold space。

H 將pattern space的數據添加到hold space。

l 用ASCII碼打印pattern space中的nonprinting character。

i\ 插入添加使用者輸入的數據行。

n 讀入下一筆數據到pattern space。

N 添加下一筆數據到pattern space。

p 打印數據。

P 打印pattern space內第一個newline字母前的數據。

q 跳出sed編輯。

r 讀入其它文件內容。

s 替換字符串。

t label先執行一替換的編輯指令,如果替換成功,則將編輯指令跳至: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/(請參照[section4.1],進行字符串的替換。

2.5 執行輸出的控制

在命令行上的選項-n(注釋[7])表示輸出由編輯指令控制。由前章內容得知,sed會"自動"將數據由pattern space輸送到標準輸出文件。但借著選項-n,可將sed這"自動"的動作改成"被動",由它所執行的編輯指令(注釋[8])來決定結果是否輸出。也就是說,有了-n,原來缺省打印所有行變為不打印。

由上述可知,選項-n必須與編輯指令一起配合,否則無法獲得結果。例如,打印white.dat文件內含有"white"字符串的數據行,其命令如下:

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

上面命令中,選項-n與編輯指令/white/p(參照[section4.6])一起配合控制輸出。其中,選項-n將輸出控制權移給編輯指令;/white/p將數據行中含有"white"字符串打印到屏幕上。

第三章、范例

一般在實際使用編輯器的過程中,常需要執行替換文件中的字符串、搬移、刪除、與搜尋數據行等等動作。當然,一般交互式編輯器(如vi、emacs)都能做得到上述功能,但一旦文件有大量上述編輯需求時,則用它們編輯十分沒有效率。本章將用舉例的方式說明如何用sed自動執行這些編輯功能。此外,在本章范例中,均以下述方式描述文件的需求:

將文件中…數據,執行…(動作)

如此,目的是為了能將它們迅速地轉成編輯指令。其中,"…數據"部份,轉成指令中的位址參數表示;"執行…動作"部份,則轉成函數參數表示。另外,當"執行…動作"要由數個函數參數表示時,則可利用"{"與"}"集合這些函數參數(注釋[9]),其指令形式如下:

地址參數{

函數參數1

函數參數2

函數參數3

.

}

上述指令表示,將對符合地址參數的數據,依次執行函數參數1、函數參數2、函數參數3…表示的動作。下面各節,分別舉例說明sed替換數據、移動、刪除數據、及搜尋數據的命令。

3.1 替換文件中的數據

3.2 搬動文件中的數據

3.3 刪除文件中的數據

3.4 搜尋文件中的數據

3.1 替換文件中的數據

Sed可替換文件中的字符串、數據行、甚至數據區。其中,表示替換字符串的指令中的函數參數為s(參照[section4.1]);表示替換數據行、或數據區的指令中的函數參數為c(參照[section4.5])。上述情況以下面三個例子說明。

例一、將文件中含"machine"字符串的數據行中的"phi"字符串,替換成為"beta"字符串。其命令行如下:

sed -e ‘/machine/s/phi/beta/g’ input.dat(以后文件都以input.dat代表)

例二、將文件中第5行數據,替換成句子"Those who in quarrels interpose, must often wipe a bloody nose."。其命令行如下

sed -e ‘5c\

Those must often wipe a bloody nose.

‘ input.dat

例三、將文件中1至100行的數據區,替換成如下兩行數據:

How are you?

data be deleted!

則其命令行如下

sed -e ‘1,100c\

How are you?\

data be deleted!

‘ input.dat

3.2 搬動文件中的數據

使用者可用sed中的hold space暫存編輯中的數據、用函數參數w(參照[section4.9])將文件數據搬動到其它文件內儲存、或用函數參數r(參照[section4.8])將其它文件內容搬到文件內。Hold space是sed用來暫存pattern space內數據的緩存器,當sed執行函數參數h、H(參照[section4.19])時,會將pattern space數據暫存到hold space;當執行函數參數x、g、G(參照[section4.22])時,會將暫存的數據取到pattern space。下面舉三個例子說明。

例一、將文件中的前100行數據,搬到文件中第300行后輸出。其命令行如下:

sed -f mov.scr 文件

mov.scr文件的內容為

1,100{

H

d

}

300G

其中,

1,100{

H

d

}

它表示將文件中的前100行數據,先儲存(參照[section4.19])在hold space之后刪除;指令300G(參照[section4.22])表示,將hold space內的數據,添加在文件中的第300行數據后輸出。

例二、將文件中含"phi"字符串的數據行,搬至mach.inf文件中儲存。其命令行如下:

sed -e ‘/phi/w mach.inf’ 文件

例三、將mach.inf文件內容,搬至文件中含"beta"字符串的數據行之下。其命令行如下:

sed -e ‘/beta/r mach.inf’ 文件

另外,由于sed是stream(參照[section1.4])編輯器,故理論上輸出后的文件數據不可能再搬回來編輯。

3.3 刪除文件中的數據

因為sed是行編輯器,所以sed很容易刪除個別數據行或整個數據區。一般用函數參數d(參照[section4.2])或D(參照[section4.17])來表示。下面舉兩個例子說明。

將文件內所有空白行全部刪除。其命令行為

sed -e ‘/^$/d’ 文件

regular expression(注釋[附錄A])中,^$表示空白行。其中,^限制其后字符串必須在行首;$限制其前字符串必須在行尾。

將文件內連續的空白行,刪除它們成為一行。其命令行為

sed -e ‘/^$/{

N

/^\n$/D

}’ 文件

其中,函數參數N(參照[section4.16])表示,將空白行的下一行數據添加至pattern space內。函數參數/^\n$/D表示,當添加的是空白行時,刪除第一行空白行,而且剩下的空白行則再重新執行指令一次。指令重新執行一次,刪除一行空白行,如此反復直至空白行后添加的為非空白行為止,故連續的空白行最后只剩一空白行被輸出。

3.4 搜尋文件中的數據

Sed可以執行類似Unix命令grep的功能。理論上,可用regular expression(參照[附錄A])。例如,將文件中含有"gamma"字符串的數據行輸出。則其命令行如下:

sed -n -e ‘/gamma/p’ 文件

但是,sed是行編輯器,它的搜尋基本上是以一行為單位。因此,當一些字符串因換行而被拆成兩部份時,一般的方法即不可行。此時,就必須以合并兩行的方式來搜尋這些數據。其情況如下面例子:

將文件中含"omega"字符串的數據輸出。其命令行如下

sed -f gp.scr 文件

gp.scr文件的內容如下:

/omega/b

N

h

s/.*\n//

/omega/b

g

D

在上述sedscript(注釋[10]),因借著函數參數b形成類似C語言中的case statement結構,使得sed可分別處理當數據內含"omega"字符串;當"omega"字符串被拆成兩行;以及數據內沒有"omega"字符串的情況。接下來就依上述的三種情況,將sed script分成下面三部份來討論。

當數據內含"omega",則執行編輯指令

/omega/b

它表示當數據內含"omega"字符串時,sed不用再對它執行后面的指令,而直接將它輸出。

當數據內沒有"omega",則執行編輯指令如下

N

h

s/.*\n//

/omega/b

其中,函數參數N(參照[section4.16]),它表示將下一行數據讀入使得pattern space內含前后兩行數據。函數參數h(參照[section4.19]),它表示將pattern space內的前后兩行數據存入hold space。函數參數s/.*\n//,它表示將pattern space內的前后兩行數據合并(注釋[11])成一行。/omega/b,它表示如果合并后的數據內含"omega"字符串,則不用再執行它之后的指令,而將此數據自動輸出:

當合并后的數據依舊不含"omega",則執行編輯指令如下

g

D

其中,函數參數g(參照[section4.21]),它表示將hold space內合并前的兩行數據放回pattern space。函數參數D(參照[section4.17]),它表示刪除兩行數據中的第一行數據,并讓剩下的那行數據,重新執行sed script。如此,無論的數據行內或行間的字符串才可搜尋完全。

第四章、介紹函數參數

本章將以一節一個函數參數的方式,介紹所有sed提供的函數參數,其中有

| s | d | a | i | c | p | l | r | w | y | ! | n | q | = | # | N | D | P | h | H | g | G | x | b | t |

另外,在各節中,首先簡單介紹函數參數功能,接著說明函數參數與地址參數配合的格式,而其中也一并描述sed執行此函數參數的工作情形。

4.1 s

函數參數s表示替換(substitute)文件內字符串。其指令格式如下:

[address1[,address2]] s/pattern/replacemen/[flag]

對上述格式有下面幾點說明:

函數參數s最多與兩個地址參數配合。

關于"s/pattern/replacement/[flag]"(注釋[12])有下面幾點說明:

pattern:它為reguler expression字符串。它表示文件中要被替換的字符串。

replacement:它為一般字符串。但其內出現下列字符有特別意義:

&:代表其前pattern字符串。例如

sed -e ‘s/test/& my car/’ 數據文件名

指令中,&代表pattern字符串"test"。故執行后,數據文件的"test"被替換成"test my car"。

\n:代表pattern中被第n個\(、\)(參照[附錄A])所括起來的字符串。例如

sed -e ‘s/\(test\) \(my\) \(car\)/[\2 \3 \1]/’ 數據文件名

指令中,\1表示"test"、\2表示"my"、\1表示"car"字符串。故執行后,數據文件的"test my car"被替換成"[my car test]"。

\:可用它來還原一些特殊符號(如上述的&與\)本身字面上的意義,或用它來代表換行。

flag:主要用它來控制一些替換情況:

當flag為g時,代表替換所有符合(match)的字符串。

當flag為十進制數m時,代表替換行內第m個符合的字符串。

當flag為p時,代表替換第一個符合pattern的字符串后,將數據輸出標準輸出文件。

當flag為w wfile時,代表替換第一個符合pattern的字符串后,輸出到wfile文件內(如果wfile不存在,則會重新打開名為wfile的文件)。

當沒有flag時,則將數據行內第一個符合pattern的字符串以replacement字符串來替換。

delimiter:在"/pattern/replace/[flag]"中"/"被當成一delimiter。除了空白(blank)、換行(newline)之外,使用者可用任何字符作為delimiter。例如下述編輯指令

s#/usr#/usr1#g

上述命令中"#"為delimiter。如果用"/"做delimiter,則sed會將pattern與replacement中的"/"當成delimiter而發生錯誤。

范例:題目:替換input.dat文件(后面如果沒有特別指定,均假設文件名為input.dat)內"1996"字符串成"1997",同時將這些數據行存入year97.dat文件內。

說明:用函數參數s指示sed將"1996"字符串替換成"1997",另外用s argument中的flag w指示sed將替換過的數據行存入year97.dat文件內。

sed命令行:

sed -e ‘s/1996/1997/w year97.dat’ input.dat

4.2 d

函數參數d表示刪除數據行,其指令格式如下:

[address1[,address2]]d

對上述格式有下面幾點說明:

函數參數d最多與兩個地址參數配合。

sed執行刪除動作情況如下:

將pattern space內符合地址參數的數據刪除;將下一筆數據讀進pattern space;重新執行sed script。

范例:可參考section3.3。

4.3 a

函數參數a表示將數據添加到文件中。其指令格式如下:

[address1] a\ 使用者所輸入的數據

對上述格式有下面幾點說明:

函數參數a最多與一個地址參數配合。

函數參數a緊接著"\"字符用來表示此行結束,使用者所輸入的數據必須從下一行輸入。如果數據超過一行,則須在每行的結尾加入"\"。

sed執行添加動作情況如下:當pattern space內數據輸出后,sed跟著輸出使用者所輸入的數據。

范例:題目:添加"多任務操作系統"在含"UNIX"字符串的數據行后。假設input.dat文件的內容如下:

UNIX

說明:用函數參數a將所輸入的數據添加在含"UNIX"字符串的數據行后。

sed命令行如下:

sed -e ‘/UNIX/a\

多任務操作系統

‘ input.dat

執行上述命令后,其輸出結果如下:

UNIX

多任務操作系統

4.4 i

函數參數i表示將數據插入文件中。其指令格式如下:

[address1] i\ 使用者所輸入的數據

對上述格式有下面幾點說明:

函數參數i最多與一個地址參數配合。

函數參數i緊接著"\"字符用來表示此行結束,使用者所輸入的數據必須從下一行輸入。如果數據超過一行,則須在每行的結尾加入"\"。

sed執行插入動作的情況如下:在pattern space內數據輸出前,sed先輸出使用者所輸入的數據。

范例:題目:將"文章版權屬于中央研究院"插在input.dat文件中含"院長:李遠哲"的數據行之前。假設input.dat文件內容如下:

院長:李遠哲

說明:用函數參數i將數據行"文章版權屬于中央研究院"插在含"院長:李遠哲"的數據行之前。

sed命令行如下:

sed -e ‘/院長:李遠哲/i\

文章版權屬于中央研究院

‘ input.dat

執行上述命令后的輸出如下:

文章版權屬于中央研究院

院長:李遠哲

4.5 c

函數參數c表示改變文件中的數據。其格式如下:

[address1[,address2]]c\ 使用者所輸入的數據

對上述格式有下面幾點說明:

函數參數c最多與兩個地址參數配合。

函數參數c緊接著"\"字符用來表示此行結束,使用者所輸入的數據必須從下一行輸入。如果數據超過一行,則須在每行的結尾加入"\"。

sed執行改變動作的情況:在pattern space內數據輸出時,sed改變它成為使用者所輸入的數據。

范例:參考section3.1之例二、三。

4.6 p

函數參數p表示打印數據。其指令格式如下:

[address1[,address2]] p

對于上述格式有下面幾點說明:

函數參數p最多與兩個地址參數配合。

sed執行打印動作的情況如下:sed拷備一份pattern space內容至標準輸出文件。

范例:參考section3.4開頭的內容。

4.7 l

函數參數l,除可將數據中的nonprinting character以ASCII碼列出外,其余均與函數參數p相同。例如,將下面input.dat文件中的^[以ASCII碼打印

The Great ^[ is a movie starring Steve McQueen.

執行命令 sed -e ‘l’ input.dat后,則輸出結果如下:

The Great \003 is a movie starring Steve McQueen.

The Great     is a movie starring Steve McQueen.

上述第二行數據為sed的自動輸出(請參照注釋[])。

4.8 r

函數參數r表示讀入它文件內容到文件中。其指令格式如下:

[address1] r 其它文件名稱

對于上述格式有下面幾點說明:

函數參數r最多與一個地址參數配合。

在指令中,函數參數r與其它文件名稱間,只能有一空格。

sed執行讀入動作的情況如下:在pattern space內數據輸出后,sed讀出其它文件的內容跟著輸出。當其它文件不存在時,sed照樣執行其它指令而不會有任何錯誤訊息產生。

范例:參考section3.1之例三。

4.9 w

函數參數w表示將文件中的寫到其它文件內。其指令格式如下:

[address1[,address2]] w 其它文件名稱

對于上述格式有下面幾點說明:

函數參數w最多與兩個地址參數配合。

在指令中,函數參數w與其它文件名稱間,只能有一空格。

sed執行寫出動作的情況如:將pattern space內數據寫到其它文件內。數據寫入時,會取代(overwrite)原來文件內的數據。另外,當其它文件不存在時,sed會重新產生(creat)它。

范例:參考section3.1之例二。

4.10 y

函數參數y表示轉換數據中的字符。其指令格式如下:

[address1[,address2]]y /xyz…/abc…/

對于上述格式有下面幾點說明:

函數參數最多配合兩個地址參數。

指令中,/abc…/xyz…/(x、y、z、a、b、c代表某些字符)為y的argument。其中abc…與xyz…的字符個數必須相同。

sed執行轉換時,將pattern space內數據內的a字符轉換成x字符、b字符轉換成y字符、c字符轉換成z字符…。

范例:題目:將input.dat文件中的小寫字母改成大寫。假設input.dat文件的內容如下:

Sodd’s Second Law:

Sooner or later, the worst possible set of

circumstances is bound to occur.

說明:利用函數參數y指示sed做字母大小的轉換。

sed命令行如下:

sed -e ‘

y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/

‘ input.dat

執行上述命令輸出結果如下:

SODD’S SECOND LAW:

SOONER OR LATER, THE WORST POSSIBLE SET OF

CIRCUMSTANCES IS BOUND TO OCCUR.

4.11 !

函數參數!表示不執行函數參數。當有如下指令時,

[address1[,address2]] ! 函數參數

表示,對符合地址參數之數據不執行函數參數。例如刪除,除了含"1996"字符串,所有數據行,則執行如下命令

sed -e ‘/1996/!d’ input.dat

4.12 n

函數參數n表示讀入下一行數據。其指令格式如下:

[address1[,address2]]n

對上述格式有下面幾點說明:

函數參數n最多配合兩個地址參數。

sed執行讀入下一行動作的情況如下:

輸出在pattern space的數據。

將下一筆數據讀到pattern space。

執行下一個編輯指令。

范例(可與[section4.18]中的范例比較):

題目:輸出input.dat文件內偶數行數據。假設input.dat文件內容如下:

The

UNIX

Operation

System

說明:在命令行上以選項-n,將數據輸出的控制權(參照[section2.5])轉給指令。

利用函數參數n將下一行數據(偶數行)取代pattern space內的數據行(奇數行)。

利用函數參數p將pattern space內的數據(偶數行)輸出。

最后,整個輸出只有原先文件內的偶數行數據。

sed命令行如下:

sed -n -e ‘n’ -e ‘p’ infro.dat

執行上述命令后,輸出的結果如下:

UNIX

System

4.13 q

函數參數q表示跳離sed。其指令格式如下:

[address1] q

對上述格式有下面幾點說明:

函數參數q最多配合一個地址參數。

sed執行跳離動作時,它停止輸入pattern space數據,同時停止數據送到標準輸出文件。

范例:題目:對文件文件執行script_file內的編輯指令,除非遇到"Linux"字符串。

說明:無論script_file內是何種指令,使用者只要在命令行上用指令/Linux/q,函數參數q會強迫sed遇到"Linux"時做跳離動作。

sed命令行如下:

sed -e ‘/Linux/q’ -f script_file input.dat

4.14 =

函數參數=表示打印數據的行數。其指令格式如下:

[address1,[address2]] =

對上述格式有下面幾點說明:

函數參數=最多配合兩個地址參數。

執行時,行數將在數據輸出前先輸出。

范例:題目:打印input.dat文件內數據行數。假設input.dat的內容如下:

The UNIX

Operating System

說明:用函數參數=來打印數據的行數。

sed命令行如下:

sed -e ‘=’ input.dat

執行上述命令后,輸出的結果如下:

1

The UNIX

2

Operating System

4.15 #

在script file內,函數參數#后的文字為注解。當注解文字超過多行時,其行間須以"\"換行字符相隔。

4.16 N

函數參數N表示添加下一筆數據在pattern space內。其指令格式如下:

[address1,[address2]] N

對上述格式有下面幾點說明:

函數參數N最多配合兩個地址參數。

sed執行時,將下一行數據讀入并添加在pattern space內,數據行間以換行字符(embedded newline character)分隔。此外,在替換時,換行字符可用\n來match。

范例:題目:將下述兩行數據合并。假設input.dat的內容如下:

The UNIX

Operating System

說明:先利用函數參數N將兩行數據置于pattern space內,在利用函數參數s/\n//將兩行數據間的分隔號\n以空白替代,如此兩行數據變成一行輸出。

sed命令行如下:

sed -e ‘N’ -e ‘s/\n/ /’ input.dat

執行上述命令后,其輸出的結果如下:

The UNIX Operating System

4.17 D

函數參數D表示刪除pattern space內的第一行數據。其指令格式如下:

[address1,address2]D

對上述格式有下面幾點說明:

函數參數D最多配合兩個地址參數。

函數參數D與d的比較如下:

當pattern space內只有一數據行時,D與d作用相同。

當pattern space內有多行數據行時

D表示只刪除pattern space內第一行數據;d則全刪除。

D表示執行刪除后,pattern space內不添加下一筆數據,而將剩下的數據重新執行sed script;d則讀入下一行后執行sed script。

范例:參考section3.3的第二個例子。

4.18 P

函數參數P表示打印patternspace內的第一行數據。其指令格式如下:

[address1,address2] P

對上述格式有下面幾點說明:

函數參數P最多配合兩個地址參數。

P與p,除了面對的pattern space內的數據行數不同外,其它均相同。

范例(可與[section4.12]中的范例):題目:輸出input.dat文件內奇數行數據。假設input.dat文件內容如下:

The

UNIX

System

說明:在命令行上

以選項-n,將數據輸出的控制權(參照[section2.5])轉給指令。

利用函數參數N將偶數行添加至pattern space內奇數行后。

利用函數參數P將pattern space內的第一行(奇數行)輸出。

在奇數行輸出后,pattern space內剩下的數據行(偶數行)則被放棄輸出。最后,整個輸出只有原先的奇數行數據。

sed命令行:

sed -n -e ‘N’ -e ‘P’ infro.dat

執行上述命令后,輸出的結果如下:

The

System

4.19 h

函數參數h表示暫存pattern space的數據至hold space。其指令格式如下:

[address1,[address2]] h

對上述格式有下面幾點說明:

函數參數h最多配合兩個地址參數。

sed執行暫存動作時,會蓋掉(overwrite) hold space內原來的數據。

當sed全部執行結束時,hold space內數據會自動清除。

范例:參考section3.4的例子。

4.20 H

函數參數H與h唯一差別是,sed執行h時,數據蓋掉(overwrite)hold space內原來的數據,而H,數據則是"添加(append)"在hold space原來數據后。例題請參考section3.2之例一。

4.21 g

函數參數g表示與函數參數h相反的動作,它表示將hold space內數據放回pattern space內。其指令格式如下:

[address1,address2]g

函數參數g最多配合兩個地址參數。

sed執行放回動作時,數據蓋掉(overwrite)(注釋[13])pattern space內原來的數據。

例題:參考section3.4的例子。

4.22 G

函數參數G與g唯一差別是,sed執行g時,數據蓋掉(overwrite)pattern space內原來的數據,而G,數據則是"添加(append)"在pattern space原來數據后。例子請參考section3.2例一。

4.23 x

函數參數x表示交換hold space與pattern space內的數據。其指令格式如下:

[address1,[address2]] x

函數參數x大部份與其它處理hold space的函數參數一起配合。例如,將input.dat文件內第1行數據取代第3行數據。此時,用函數參數h與x來配合。其中,以函數參數h將第1數據存入hold space;當第3行數據出現在pattern space,以函數參數x交換hold space與pattern space的內容。如此,第3行數據就被第1數據替代。其命令行如下:

sed -e ‘1h’ -e ‘3x’ input.dat

4.24 b、:label

函數參數:與函數參數b可在sed script內建立類似BASIC語言中GOTO指令的功能。其中,函數參數:

建立標記:函數參數b將下一個執行的指令branch到標記處執行。函數參數:與b,在script file內配合的情況如下

.

.

.

編輯指令m1

:記號

編輯指令m2

.

.

.

[address1,[address2]]b [記號]

其中,當sed執行至指令[address1,[address2]]b [記號]時,如pattern space內的數據符合地址參數,則sed將下一個執行的位置branch至由:記號(注釋[14])設定的標記處,也就是再由"編輯指令m2"…執行。另外,如果指令中函數參數b后沒有記號,則sed將下一個執行的指令branch到script file的最后,利用此可使sed script內有類似C語言中的case statement結構。

范例:題目:將input.dat文件內數據行的開頭字母重復印40次。假設input.dat文件的內容如下:

A

B

C

說明:用指令b p1與:p1構成執行增加字母的循環(loop),同時在字母出現40個時,也用指令b來跳出循環。下面就以文件內第一行數據"A"為例,描述它如何連續多添加39個"A"在同一行:

用指令s/A/AA/(參照section4.1)將"A"替換成"AA"。

用指令b p1與:p1構成循環(loop),它目的使上述動作被反復的執行。每執行一次循環,則數據行上的"A"就多出一個。例如,第一次循環數據行變成"AA",第二次循環數據行變成"AAA"…。

用指令[ABC]\{40\}/b(注釋[15])來作為停止循環的條件。當數據行有連續40個A出現時,函數參數b將執行的指令跳到最后,停止對此行的編輯。

同樣,對其他數據行也如同上述的方式執行。

sed命令行如下:

sed -e ‘{

:p1

/A/s/A/AA/

/B/s/B/BB/

/C/s/C/CC/

/[ABC]\{40\}/b

b p1

}’ input.dat

4.25 t

基本上,函數參數t與函數參數b的功能類似,除了在執行t的branch前,會先去測試其前的替換指令有沒有執行替換成功外。在script file內的情況如下:

.

.

.

編輯指令m1

:記號

編輯指令m2

.

.

.

s/…/…/

[address1,[address2]]t [記號]

編輯指令m3

其中,與函數參數b不同處在于,執行函數參數t branch時,會先檢查其前一個替換指令成功與否。如成功,則執行branch;不成功,則不branch,而繼續執行下一個編輯指令,例如上面的編輯指令m3。

范例:題目:將input.dat文件中數據A1替換成C1、C1替換成B1、B1替換成A1。input.dat文件的內容如下:

代號

B1

A1

B1

C1

A1

C1

說明:input.dat文件中全部數據行只需要執行一次替換動作,但為避免數據被替換多次,所以利用函數參數t在sed script內形成一類似C語言中case statement結構,使每行數據替換一次后能立即用函數參數t跳離替換編輯。

sed命令行:

sed -e ‘{

s/A1/C1/

t

s/C1/B1/

t

s/B1/A1/

t

}’ input.dat

附錄A:常用的regular expression

普通字符 由普通字符所組成的regular expression,其意義與原字符串字面意義相同。

^字符串 限制字符串必須出現于行首 。

$字符串 限制字符串必須出現行尾。

. 表示任意一字符。

[…] 字符集合,用以表示兩中括號間所有字符當中的任一個,如[^…]表示兩中括號間所有字符以外的字符。

-& 字符集合中可用"&"指定字符的范圍。

* 用以形容其前的字符(或字符集合)可重復任意多次。

\n 表示嵌入新行字符(embedded new line character)。

\(…\) 在regular expression中使用"\(""\)"來括住一部份的regular expression:

其后可用"\1"來表示第一個被"\(""\)"括住的部份。若regular expression中使用數次的"\("和"\)"來括住不同的部份,則依次使用"\1","\2","\3",…(最多可到"\9")。

另外,在不同平臺上,regular expression會有一些不同的限制,詳細情況參照appendix B。

HP-UX Release 9.01與SunOS 5.4內sed對regular expression中各種特殊字符的接受能力

regular expression的特殊字符    HP-UX Release 9.01       SunOS 5.4

.                               接受                     接受

*                               接受                     接受

^                               接受                     接受

$                               接受                     接受

\                               接受                     接受

[ ]                             接受                     接受

\( \)與\1 … \9合用            接受                     接受

\{重復次數\}                    接受                     接受

\{下限,上限\}                   接受                     接受

\下限,\}                        接受                     接受

\                               不接受                   接受

+                               不接受                   不接受

?                               不接受                   不接受

|                               不接受                   不接受

( )                             不接受                   不接受

&                               接受                     接受

注釋

注釋[1]:

就是后面將會提到的sed script。

注釋[2]:

指令s/Unix/UNIX/表示將"Unix"替換成"UNIX"。請參照section4.1。

注釋[3]:

在指令中有20幾個函數參數可供選擇。

注釋[4]:

以后這文件稱作script file。

注釋[5]:

編輯指令1,10d中,地址參數為1,10,故1至10行的數據執行函數參數d所指定的刪除動作。

注釋[6]:

編輯指令s/yellow/black/g中,由于沒有地址參數,故所有的數據行都要執行函數參數s/yellow/black/g所指定替換動作。在函數參數s/yellow/black/g中,/yellow/black/g為s的argument,其表示替換數據行中所有的"yellow"成"black"。

注釋[7]:

其命令格式如下:

sed -n [-e 編輯指令].. [-f script_file].. [文件..]

注釋[8]:

這些編輯指令中的函數參數可能是p、l、s的其中之一。

注釋[9]:

在有些情況下,也可用編輯指令代替函數參數。例如section3.3之例二。

注釋[10]:

這里,sed script是指gp.scr文件的內容。它表示這一次sed執行的編輯指令。

注釋[11]:

此函數參數,表示替換掉(除掉)pattern space內兩行間的換行記號。故pattern space內只有一行數據。

注釋[12]:

/pattern/replacement/[flag]為函數參數s的argument。

注釋[13]:

注意此時,雖然數據是放回pattern space,但hold space的內容還是不變。

注釋[14]:

注意":"與記號間不可有空格。

注釋[15]:

地址參數[ABC]\{40\},表示40個A字母或40個B字母或40個C字母。其中[ABC]表示"A"或"B"或"C";其后的\{40\}表示其前的字母有40個。regular expression請參照附錄A。

本文來自:Linux文庫 — http://doc.linuxpk.com/472.html

文章出自:CCIE那點事 http://www.qdxgqk.live/ 版權所有。本站文章除注明出處外,皆為作者原創文章,可自由引用,但請注明來源。 禁止全文轉載。
本文標題:SED手冊
本文鏈接:http://www.qdxgqk.live/?p=3170轉載請注明轉自CCIE那點事
如果喜歡:點此訂閱本站
上篇文章:
  • 相關文章
  • 為您推薦
  • 各種觀點
?
暫時還木有人評論,坐等沙發!
發表評論

您必須 [ 登錄 ] 才能發表留言!

?
?
萌宠夺宝游戏