#拿掉單一一個 | 豎槓,採用詞首和詞尾定位符express
sed -e "s|\<\|\>||g"app
SED手冊
1.Introduction
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能一次執行完將文件中全部空白行刪除、替換字串、並將使用者輸入的文字添加在文件的第六行等等不一樣的編輯動做。
1.2何處得到sed
通常的UNIX系統,自己即附有sed。不一樣的UNIX系統所附的sed版本亦不盡相同。若讀者所使用的UNIX系統上未附有sed ,則可透過anonymous 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手冊- 2.使用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]
其中,位址參數address一、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"字串印出螢幕。編輯器
#########################函數
SED手冊- 3.例
通常在實際使用編輯器的過程當中,常須要執行替換文件中的字串、搬移、刪除、與搜尋資料行等等動做。
固然,通常交談式編輯器(如vi、emacs)都能作獲得上述功能,但文件一旦有大量上述編輯需求時,則用它們編輯十分沒有效率。本章將用舉例的方式說明如何用sed自動執行這些編輯功能。此外,在本章例中,均如下述方式描述文件的需求:
將文件中...資料,執行...(動做)
如此,目的是爲了能將它們迅速的轉成編輯指令。其中, " ...資料"部份,轉成指令中的位址參數表示;"執行...動做"部份,則轉成函數參數表示。另外,當"執行...動做"要由數個函數參數表示時,則可利用"{ "與" }"集合這些函數參數(解[9]) ,其指令形式以下:
位址參數{
函數參數1
函數參數2
函數參數3
.
:
}
上述指令表示,將對符合位址參數的資料,依次執行函數參數一、函數參數二、函數參數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之後刪除;ui
指令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
/^$/D
}'文件檔
其中,函數參數N(參照[section4.16])表示,將空白行的下一行資料添加至pattern space內。spa
函數參數/^$/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/.* //
/omega/b
g
D
在上述sed script(解[10]),因藉着函數參數b造成相似C語言中的case statement結構,使得sed可分別處理當資料內含"omega"字串;當"omega"字串被拆成兩行;以及資料內沒有"omega"字串的狀況。接下來就依上述的三種狀況,將sed script分紅下面三部份來討論。
當資料內含"omega" ,則執行編輯指令
/omega/b
它表示當資料內含"omega"字串時, sed不用再對它執行後面的指令,而直接將它輸出。
當資料內沒有"omega" ,則執行編輯指令以下
N
h
s/.* //
/omega/b
其中,函數參數N(參照[section 4.16]) ,它表示將下一行資料讀入使得pattern space內含前後兩行資料。函數參數h(參照[section 4.19]) ,它表示將pattern space內的前後兩行資料存入hold space。函數參數s/.* // ,它表示將pattern space內的前後兩行資料合(解[11])成一行。/omega/b ,它表示若是合後的資料內含"omega"字串,則不用再執行它之後的指令,而將此資料自動輸出;當合後的資料依舊不含"omega" ,則執行編輯指令以下
g
D
其中,函數參數g(參照[section4.21]) ,它表示將hold space內合前的兩行資料放回pattern space。函數參數D(參照[section4.17]) ,它表示刪除兩行資料中的第一行資料,並讓剩下的那行資料,從新執行sed script。如此,不管的資料行內或行間的字串纔可搜尋徹底。unix
##########################orm
SED手冊- 4.介紹函數參數
本章將以一節一個函數參數的方式,介紹全部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"。
:表明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
上述命令中verb|#|爲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。
例:可參考section 3.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改變它成爲使用者所輸入的資料。
例:參考section 3.1之例2、三。
4.6 p
函數參數p表示印出資料。其指令格式以下:
[address1[ , address2]] p
對於上述格式有下面幾點說明:
函數參數p最多與兩個位址參數配合。
sed執行印出動做的狀況以下: sed拷備一份pattern space內容至標準輸出檔。
例:參考section 3.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對象