- 論壇徽章:
- 0
|
文本操作 搜索與代換
#sed -e 's/sex/s*e*x/g' /path/*.cgi
SED 手冊(cè) - 2. 使用 sed
http://phi.sinica.edu.tw aspac@phi.sinica.edu.tw (2001-07-29 09:05:00)
Sed 命令列可分成編輯指令與文件檔部份。其中 , 編輯指令負(fù)責(zé)控制所有的編輯工作 ; 文件檔表示所處理的檔案。
sed 的編輯指令均由位址(address)與函數(shù)(function)兩部份組成 , 其中 , 在執(zhí)行時(shí) , sed 利用它的位址參數(shù)來(lái)
決定編輯的對(duì)象;而用它的函數(shù)參數(shù)(解[3])編輯。
此外 , sed 編輯指令 , 除了可在命令列上執(zhí)行 , 也可在檔案內(nèi)執(zhí)行。其中差別只是在命令列上執(zhí)行時(shí) , 其前必
須加上選項(xiàng) -e ; 而在檔案(解[4])內(nèi)時(shí) , 則只需在其檔名前加上選項(xiàng) -f。另外 , sed 執(zhí)行編輯指令是依照它
們?cè)诿盍猩匣驒n內(nèi)的次序。
下面各節(jié) , 將介紹執(zhí)行命令列上的編輯指令 、sed 編輯指令、執(zhí)行檔案內(nèi)的編輯指令、執(zhí)行多個(gè)檔案的編輯、及
執(zhí)行 sed 輸出控制。
2.1 執(zhí)行命令列上的編輯指令
2.2 sed 編輯指令
2.3 執(zhí)行檔案內(nèi)的編輯指令
2.4 執(zhí)行多個(gè)檔案的編輯
2.5 執(zhí)行 sed 輸出控制
2.1.執(zhí)行命令列上的編輯指令
當(dāng)編輯指令(參照[section 2.2])在命令列上執(zhí)行時(shí) , 其前必須加上選項(xiàng) -e 。其命令格式如下 :
sed -e '編輯指令1' -e '編輯指令2' ... 文件檔
其中 , 所有編輯指令都緊接在選項(xiàng) -e 之後 , 并置於兩個(gè) " ' " 特殊字元間。另外 , 命令上編輯指令的執(zhí)行是由
左而右。
一般編輯指令不多時(shí) , 使用者通常直接在命令上執(zhí)行它們。例如 , 刪除 yel.dat 內(nèi) 1 至 10 行資料 , 并將其
馀文字中的 "yellow" 字串改成 "black" 字串。此時(shí) , 可將編輯指令直接在命令上執(zhí)行 , 其命令如下 :
sed -e '1,10d' -e 's/yellow/black/g' yel.dat
在命令中 , 編輯指令 '1,10d'(解[5])執(zhí)行刪除 1 至 10 行資料 ; 編輯指令 's/yellow/black/g'(解[6]) ,
"yellow" 字串替換(substuite)成 "black" 字串。
2.2 sed 的編輯指令
sed 編輯指令的格式如下 :
[address1[,address2]]function[argument]
其中 , 位址參數(shù) address1 、address2 為行數(shù)或 regular expression 字串 , 表示所執(zhí)行編輯的資料行 ; 函數(shù)參
數(shù) function[argument] 為 sed 的內(nèi)定函數(shù) , 表示執(zhí)行的編輯動(dòng)作。
下面兩小節(jié) , 將仔細(xì)介紹位址參數(shù)的表示法與有哪些函數(shù)參數(shù)供選擇。
2.2.1 位址(address)參數(shù)的表示法
實(shí)際上 , 位址參數(shù)表示法只是將要編輯的資料行 , 用它們的行數(shù)或其中的字串來(lái)代替表示它們。下面舉幾個(gè)例子
說(shuō)明(指令都以函數(shù)參數(shù) d(參照[section4.2]) 為例) :
刪除檔內(nèi)第 10 行資料 , 則指令為 10d。
刪除含有 "man" 字串的資料行時(shí) , 則指令為 /man/d。
刪除檔內(nèi)第 10 行到第 200 行資料, 則指令為 10,200d。
刪除檔內(nèi)第 10 行到含 "man" 字串的資料行 , 則指令為 10,/man/d。
接下來(lái) , 以位址參數(shù)的內(nèi)容與其個(gè)數(shù)兩點(diǎn) , 完整說(shuō)明指令中位址參數(shù)的表示法(同樣也以函數(shù)參數(shù) d 為例)。
位址參數(shù)的內(nèi)容:
位址為十進(jìn)位數(shù)字 : 此數(shù)字表示行數(shù)。當(dāng)指令執(zhí)行時(shí) , 將對(duì)符合此行數(shù)的資料執(zhí)行函數(shù)參數(shù)指示的編輯動(dòng)作。例如 ,
刪除資料檔中的第 15 行資料 , 則指令為 15d(參照[section4.2])。其馀類推 ,如刪除資料檔中的第 m 行資料 , 則
指令為 md 。
位址為 regular expression(參照[附錄 A]):
當(dāng)資料行中有符合 regular expression 所表示的字串時(shí) , 則執(zhí)行函數(shù)參數(shù)指示的編輯動(dòng)作。另外 , 在
regular expression 前後必須加上 "/"。例如指令為 /t.*t/d , 表示刪除所有含兩 "t" 字母的資料行。其中 , "."
表示任意字元; "*" 表示其前字元可重任意次 , 它們結(jié)合 ".*" 表示兩 "t" 字母間的任意字串。
位址參數(shù)的個(gè)數(shù) : 在指令中 , 當(dāng)沒(méi)有位址參數(shù)時(shí) , 表示全部資料行執(zhí)行函數(shù)參數(shù)所指示的編輯動(dòng)作; 當(dāng)只有一位址
參數(shù)時(shí) , 表示只有符合位址的資料行才編輯 ; 當(dāng)有兩個(gè)位址參數(shù) , 如 address1,address2 時(shí) , 表示對(duì)資料區(qū)執(zhí)行
編輯 , address1 代表起始資料行 , address2 代表結(jié)束資料行。對(duì)於上述內(nèi)容 , 以下面例子做具說(shuō)明。
例如指令為
d
其表示刪除檔內(nèi)所有資料行。
例如指令為
5d
其表示刪除檔內(nèi)第五行資料。
例如指令為
1,/apple/d
其表示刪除資料區(qū) , 由檔內(nèi)第一行至內(nèi)有 "apple" 字串的資料行。
例如指令為
/apple/,/orange/d
其表示刪除資料區(qū) , 由檔內(nèi)含有 "apple" 字串至含有 "orange" 字串的資料行
2.2.2 有那些函數(shù)(function)參數(shù)
下頁(yè)表中介紹所有 sed 的函數(shù)參數(shù)(參照[chapter 4])的功能。
函數(shù)參數(shù) 功能
: label 建立 script file 內(nèi)指令互相參考的位置。
# 建立解
{ } 集合有相同位址參數(shù)的指令。
! 不執(zhí)行函數(shù)參數(shù)。
= 印出資料行數(shù)( line number )。
a\ 添加使用者輸入的資料。
b label 將執(zhí)行的指令跳至由 : 建立的參考位置。
c\ 以使用者輸入的資料取代資料。
d 刪除資料。
D 刪除 pattern space 內(nèi)第一個(gè) 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 內(nèi)第一個(gè) newline 字母 \ 前的資料。
q 跳出 sed 編輯。
r 讀入它檔內(nèi)容。
s 替換字串。
t label 先執(zhí)行一替換的編輯指令 , 如果替換成牛p>;則將編輯指令跳至 : label 處執(zhí)行。
w 寫(xiě)資料到它檔內(nèi)。
x 交換 hold space 與 pattern space 內(nèi)容。
y 轉(zhuǎn)換(transform)字元。
雖然 , sed 只有上表所述幾個(gè)擁有基本編輯功能的函數(shù) , 但由指令中位址參數(shù)和指令與指令間的配合 , 也能使
sed 完成大部份的編輯任務(wù)。
2.3 執(zhí)行檔案內(nèi)的編輯指令
當(dāng)執(zhí)行的指令太多 , 在命令列上撰寫(xiě)起來(lái)十分混亂 , 此時(shí) , 可將這些指令整理儲(chǔ)存在檔案
(譬如檔名為 script_file )內(nèi) , 用選項(xiàng) -f script_file , 則讓 sed 執(zhí)行 script_file 內(nèi)的編輯指令。其命
令的格示如下 :
sed -f script_file 文件檔
其中 , 執(zhí)行 script_file 內(nèi)編輯指令的順序是由上而下。例如上一節(jié)的例子 , 其可改成如下命令:
sed -f ysb.scr yel.dat
其中 , ysb.scr 檔的內(nèi)容如下 :
1,10d
s/yellow/black/g
另外 , 在命令列上可混合使用選項(xiàng) -e 與 -f , sed 執(zhí)行指令順序依然是由命令列的左到右, 如執(zhí)行至 -f 後
檔案內(nèi)的指令 , 則由上而下執(zhí)行。
2.4 執(zhí)行多個(gè)文件檔的編輯
在 sed 命令列上 , 一次可執(zhí)行編輯多個(gè)文件檔 , 它們跟在編輯指令之後。例如 , 替換
white.dat、red.dat、black.dat 檔內(nèi)的 "yellow" 字串成 "blue" , 其命令如下:
sed -e 's/yellow/blue/g' white.dat red.dat black.dat
上述命令執(zhí)行時(shí) , sed 依 white.dat、red.dat、black.dat 順序 , 執(zhí)行編輯指令 s/yellow/blue/(請(qǐng)參照[section 4.1] ,
進(jìn)行字串的替換。
2.5.執(zhí)行輸出的控制
在命令列上的選項(xiàng) -n (解[7]) 表示輸出由編輯指令控制。由前章內(nèi)容得知 , sed 會(huì) "自動(dòng)的" 將資料由
pattern space 輸送到標(biāo)準(zhǔn)輸出檔。但藉著選項(xiàng) -n , 可將 sed 這 "自動(dòng)的" 的動(dòng)作改成 "被動(dòng)的" 由它所執(zhí)行的
編輯指令(解[8])來(lái)決定結(jié)果是否輸出。
由上述可知 , 選項(xiàng) -n 必須與編輯指令一起配合 , 否則無(wú)法獲得結(jié)果。例如 , 印出 white.dat 檔內(nèi)含有 "white"
字串的資料行 , 其命令如下:
sed -n -e '/white/p' white.dat
上面命令中 , 選項(xiàng) -n 與編輯指令 /white/p (參照[section4.6]) 一起配合控制輸出。其中 , 選項(xiàng) -n 將輸出控制權(quán)
移給編輯指令;/white/p 將資料行中含有 "white" 字串印出螢?zāi)弧?nbsp; |
|