- 論壇徽章:
- 0
|
get on
4.15 #
在 script file 內(nèi) , 函數(shù)參數(shù) # 後的文字為注解。當(dāng)注解文字超過(guò)多行時(shí) , 其行間須以 "\" 換行字元相隔。
4.16 N
函數(shù)參數(shù) N 表示添加下一筆資料在 pattern space 內(nèi)。其指令格式如下:
[address1 ,[address2]] N
對(duì)上述格式有下面幾點(diǎn)說(shuō)明 :
函數(shù)參數(shù) N 最多配合兩個(gè)位址參數(shù)。
sed 執(zhí)行時(shí) , 將下一行資料讀入並添加在 pattern space 內(nèi) , 資料行間以換行字元(embedded newline character)分隔。此外 , 在替換時(shí) , 換行字元可用 \n 來(lái) match。
範(fàn)例 :
題目: 將下述兩行資料合併。假設(shè) input.dat 的內(nèi)容如下 :
The UNIX
Operating System
說(shuō)明 : 先利用函數(shù)參數(shù) N 將兩行資料置於 pattern space 內(nèi) , 在利用函數(shù)參數(shù) s/\n/ / 將兩行資料間的分隔號(hào) \n 以空白替代 , 如此兩行資料變成一行輸出。
sed 命令列如下 :
sed -e 'N' -e 's/\n/ /' input.dat
執(zhí)行上述命令後 , 其輸出的結(jié)果如下:
The UNIX Operating System
4.17 D
函數(shù)參數(shù) D 表示刪除 pattern space 內(nèi)的第一行資料。其指令格式如下:
[address1,address2]D
對(duì)上述格式有下面幾點(diǎn)說(shuō)明 :
函數(shù)參數(shù) D 最多配合兩個(gè)位址參數(shù)。
函數(shù)參數(shù) D 與 d 的比較如下 :
當(dāng) pattern space 內(nèi)只有一資料行時(shí) , D 與 d 作用相同。
當(dāng) pattern space 內(nèi)有多行資料行時(shí)
D 表示只刪除 pattern space 內(nèi)第一行資料 ; d 則全刪除。
D 表示執(zhí)行刪除後 , pattern space 內(nèi)不添加下一筆資料 , 而將剩下的資料重新執(zhí)行 sed script ; d 則讀入下一行後執(zhí)行 sed script。
範(fàn)例 : 參考 section 3.3 的第二個(gè)例子。
4.18 P
函數(shù)參數(shù) P 表示印出 pattern space 內(nèi)的第一行資料。其指令格式如下:
[address1,address2] P
對(duì)上述格式有下面幾點(diǎn)說(shuō)明 :
函數(shù)參數(shù) P 最多配合兩個(gè)位址參數(shù)。
P 與 p , 除了面對(duì)的 pattern space 內(nèi)的資料行數(shù)不同外 , 其它均相同。
範(fàn)例(可與[section4.12]中的範(fàn)例):
題目 : 輸出 input.dat 檔內(nèi)奇數(shù)行資料。假設(shè) input.dat 檔內(nèi)容如下:
The
UNIX
System
說(shuō)明: 在命令列上
以選項(xiàng) -n , 將資料輸出的控制權(quán)(參照[section2.5])轉(zhuǎn)給指令。
利用函數(shù)參數(shù) N 將偶數(shù)行添加至 pattern space 內(nèi)奇數(shù)行後。
利用函數(shù)參數(shù) P 將 pattern space 內(nèi)的第一行(奇數(shù)行)輸出。
在奇數(shù)行輸出後 , pattern space 內(nèi)剩下的資料行(偶數(shù)行)則被放棄輸出。最後 , 整個(gè)輸出只有原先的奇數(shù)行資料。
sed 命令列 :
sed -n -e 'N' -e 'P' infro.dat
執(zhí)行上述命令後 , 輸出的結(jié)果如下 :
The
System
4.19 h
函數(shù)參數(shù) h 表示暫存 pattern space 的資料至 hold space。其指令格式如下:
[address1 ,[address2]] h
對(duì)上述格式有下面幾點(diǎn)說(shuō)明 :
函數(shù)參數(shù) h 最多配合兩個(gè)位址參數(shù)。
sed 執(zhí)行暫存動(dòng)作時(shí) , 會(huì)蓋掉(overwrite) hold space 內(nèi)原來(lái)的資料。
當(dāng) sed 全部執(zhí)行結(jié)束時(shí) , hold space 內(nèi)資料會(huì)自動(dòng)清除。
範(fàn)例 :參考 section 3.4 的例子。
4.20 H
函數(shù)參數(shù) H 與 h 唯一差別是 , sed 執(zhí)行 h 時(shí) , 資料蓋掉(overwrite) hold space 內(nèi)原來(lái)的資料 , 而 H , 資料則是 "添加(append)" 在 hold space 原來(lái)資料後。例題請(qǐng)參考 section 3.2 之例一。
4.21 g
函數(shù)參數(shù) g 表示與函數(shù)參數(shù) h 相反的動(dòng)作 , 它表示將 hold space 內(nèi)資料放回 pattern space 內(nèi)。其指令格式如下 :
[address1,address2]g
函數(shù)參數(shù) g 最多配合兩個(gè)位址參數(shù)。
sed 執(zhí)行放回動(dòng)作時(shí) , 資料蓋掉(overwrite)(註解[13]) pattern space 內(nèi)原來(lái)的資料。
例題 :參考 section 3.4 的例子。
4.22 G
函數(shù)參數(shù) G 與 g 唯一差別是 , sed 執(zhí)行 g 時(shí) , 資料蓋掉(overwrite) pattern space 內(nèi)原來(lái)的資料 , 而 G , 資料則是 "添加(append)" 在 pattern space 原來(lái)資料後。例子請(qǐng)參考 section 3.2 例一。
4.23 x
函數(shù)參數(shù) x 表示交換 hold space 與 pattern space 內(nèi)的資料。其指令格式如下 :
[address1 ,[address2]] x
函數(shù)參數(shù) x 大部份與其它處理 hold space 的函數(shù)參數(shù)一起配合。例如 , 將 input.dat 檔內(nèi)第 1 行資料取代第 3 行資料。此時(shí) , 用函數(shù)參數(shù) h 與 x 來(lái)配合。其中 , 以函數(shù)參數(shù) h 將第 1 資料存入 hold space ; 當(dāng)?shù)?3 行資料出現(xiàn)在 pattern space , 以函數(shù)參數(shù) x 交換 hold space 與 pattern space 的內(nèi)容。如此 , 第 3 行資料就被第 1 資料替代。其命令列如下:
sed -e '1h' -e '3x' input.dat
4.24 b、:label
函數(shù)參數(shù) : 與函數(shù)參數(shù) b 可在 sed script 內(nèi)建立類似 BASIC 語(yǔ)言中 GOTO 指令的功能。其中 , 函數(shù)參數(shù) : 建立標(biāo)記;函數(shù)參數(shù) b 將下一個(gè)執(zhí)行的指令 branch 到標(biāo)記處執(zhí)行。函數(shù)參數(shù) : 與 b , 在 script file 內(nèi)配合的情況如下
.
.
.
編輯指令m1
:記號(hào)
編輯指令m2
.
.
.
[address1,[address2]]b [記號(hào)]
其中 , 當(dāng) sed 執(zhí)行至指令 [address1,[address2]]b [記號(hào)] 時(shí) , 如 pattern space 內(nèi)的資料符合位址參數(shù) , 則 sed 將下一個(gè)執(zhí)行的位置 branch 至由 :記號(hào)(註解[14])設(shè)定的標(biāo)記處 , 也就是再由 "編輯指令m2" ... 執(zhí)行。另外 , 如果指令中函數(shù)參數(shù) b 後沒有記號(hào) , 則 sed 將下一個(gè)執(zhí)行的指令 branch 到 script file 的最後 , 利用此可使 sed script 內(nèi)有類似 C 語(yǔ)言中的 case statement 結(jié)構(gòu)。
範(fàn)例 :
題目: 將 input.dat 檔內(nèi)資料行的開頭字母重覆印 40 次。假設(shè) input.dat 檔的內(nèi)容如下 :
A
B
C
說(shuō)明: 用指令 b p1 與 :p1 構(gòu)成執(zhí)行增加字母的迴圈(loop) , 同時(shí)在字母出現(xiàn) 40 個(gè)時(shí) , 也用指令 b 來(lái)跳出迴圈。下面就以檔內(nèi)第一行資料 "A" 為例 , 描述它如何連續(xù)多添加 39 個(gè) "A" 在同一行:
用指令 s/A/AA/(參照 section4.1)將 "A" 替換成 "AA"。
用指令 b p1 與 :p1 構(gòu)成迴圈(loop) , 它目的使上述動(dòng)作被反覆的執(zhí)行。每執(zhí)行一次迴圈 , 則資料行上的 "A" 就多出一個(gè)。例如 , 第一次迴圈資料行變成 "AA" , 第二次迴圈資料行變成 "AAA" ...。
用指令 [ABC]\{40\}/b(註解[15]) 來(lái)作為停止迴圈的條件。當(dāng)資料行有連續(xù) 40 個(gè) A 出現(xiàn)時(shí) , 函數(shù)參數(shù) b 將執(zhí)行的指令跳到最後 , 停止對(duì)此行的編輯。
同樣 , 對(duì)其它資料行也如同上述的方式執(zhí)行。
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
基本上 , 函數(shù)參數(shù) t 與 函數(shù)參數(shù) b 的功能類似 , 除了在執(zhí)行 t 的 branch 前 , 會(huì)先去測(cè)試其前的替換指令有沒有執(zhí)行替換成功外。在 script file 內(nèi)的情況如下:
.
.
.
編輯指令m1
:記號(hào)
編輯指令m2
.
.
.
s/.../.../
[address1,[address2]]t [記號(hào)]
編輯指令m3
其中 , 與函數(shù)參數(shù) b 不同處在於 , 執(zhí)行函數(shù)參數(shù) t branch 時(shí) , 會(huì)先檢查其前一個(gè)替換指令成功與否。如成功 , 則執(zhí)行 branch ; 不成功 , 則不 branch , 而繼續(xù)執(zhí)行下一個(gè)編輯指令 , 例如上面的編輯指令m3。
範(fàn)例:
題目 : 將 input.dat 檔中資料 A1 替換成 C1、C1 替換成 B1、B1 替換成 A1。input.dat 檔的內(nèi)容如下:
代號(hào)
B1
A1
B1
C1
A1
C1
說(shuō)明 : input.dat 檔中全部資料行只需要執(zhí)行一次替換動(dòng)作 , 但為避免資料被替換多次 , 所以利用函數(shù)參數(shù) t 在 sed script 內(nèi)形成一類似 C 語(yǔ)言中 case statement 結(jié)構(gòu) , 使每行資料替換一次後能立即用函數(shù)參數(shù) t 跳離替換編輯。
sed 命令列 :
sed -e '{
s/A1/C1/
t
s/C1/B1/
t
s/B1/A1/
t
}' input.dat
--------------------------------------------
常用的 regular expression
--------------------------------------------------------------------------------
常用的 regular expression
普通字元 由普通字元所組成的 regular expression 其意義與原字串字面意義相同。
^字串 限制字串必須出現(xiàn)於行首 。
$字串 限制字串必須出現(xiàn)行尾。
. 表示任意一字元。
[...] 字元集合, 用以表示兩中括號(hào)間所有字元當(dāng)中的任一個(gè) ,如 [^...]表示兩中括號(hào)間所有字元以外的字元。
-& 字元集合中可用"&"指定字元的範(fàn)圍。
* 用以形容其前的字元(或字元集合)可重覆任意多次 。
\n 表示嵌入新行字元(imbedded new line character)。
\(...\) 於 regular expression 中使用"\(" "\)"來(lái)括住一部份的 regular expression ; 其後可用"\1"來(lái)表示第一個(gè)被"\(" "\)"括住的部份。若 regular expression 中使用數(shù)次的"\(" "\)"來(lái)括住不同的部份 , 則依次使用"\1","\2","\3",...(最多可到"\9")。
[ 本帖最后由 mocou 于 2005-12-21 20:46 編輯 ] |
|