青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

c++實(shí)例研究

從0開始

  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  104 隨筆 :: 0 文章 :: 20 評(píng)論 :: 0 Trackbacks
原文地址:http://blog.chinaunix.net/u3/109488/showart_2138455.html
fhc2007@fhc2007-desktop:~$ sed --help
用法: sed [選項(xiàng)]... {腳本(如果沒有其他腳本)} [輸入文件]...
-n, --quiet, --silent
取消自動(dòng)打印模式空間
-e 腳本, --expression=腳本
添加“腳本”到程序的運(yùn)行列表
-f 腳本文件, --file=腳本文件
添加“腳本文件”到程序的運(yùn)行列表
-i[擴(kuò)展名], --in-place[=擴(kuò)展名]
直接修改文件(如果指定擴(kuò)展名就備份文件)
-l N, --line-length=N
指定“l”命令的換行期望長(zhǎng)度
--posix
關(guān)閉所有 GNU 擴(kuò)展
-r, --regexp-extended
在腳本中使用擴(kuò)展正則表達(dá)式
-s, --separate
將輸入文件視為各個(gè)獨(dú)立的文件而不是一個(gè)長(zhǎng)的連續(xù)輸入
-u, --unbuffered
從輸入文件讀取最少的數(shù)據(jù),更頻繁的刷新輸出
--help     打印幫助并退出
--version  輸出版本信息并退出
如果沒有 -e, --expression, -f 或 --file 選項(xiàng),那么第一個(gè)非選項(xiàng)參數(shù)被視為
sed腳本。其他非選項(xiàng)參數(shù)被視為輸入文件,如果沒有輸入文件,那么程序?qū)臉?biāo)準(zhǔn)輸入讀取數(shù)據(jù)。

ps: -n 參數(shù)和 -i 參數(shù)不要一起使用。


本章將以一節(jié)一個(gè)函數(shù)參數(shù)的方式 ,介紹所有 sed 提供的函數(shù)參數(shù) , 其中有

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

另外 , 在各節(jié)中 , 首先簡(jiǎn)單介紹函數(shù)參數(shù)功能 , 接著說明函數(shù)參數(shù)與位址參數(shù)配合的格式 ,而其中也一并描述 sed 執(zhí)行此函數(shù)參數(shù)的工作情形。

s

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

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

對(duì)上述格式有下面幾點(diǎn)說明 :

1、函數(shù)參數(shù) s 最多與兩個(gè)位址參數(shù)配合。
2、關(guān)於 “s/pattern/replacement/[flag]” 有下面幾點(diǎn)說明:

  • pattern : 它為 reguler expression 字串。它表示文件中要被替換的字串。
  • replacement : 它為一般字串。但其內(nèi)出現(xiàn)下列元字符有特別意義 :
    • & : 代表其前 pattern 字串。例如
      sed -e 's/test/& my car/' 資料檔名

      指令中 , & 代表 pattern 字串 “test”。故執(zhí)行後 , 資料檔的 “test” 被替換成 “test my car”。

    • \n : 代表 pattern 中被第 n ( n 是從 1 到 9 的數(shù)字)個(gè) \( 、\) 所括起來的字串。例如
      sed -e 's/\(test\) \(my\) \(car\)/[\2 \3 \1]/' 資料檔名

      指令中 , \1 表示 “test”、\2 表示 “my”、\3 表示 “car” 字串。故執(zhí)行後 , 資料檔的 “test my car”被替換成 “[my car test]“。(注解:\( \) 與 \1 … \9 合用)

    • \ : 可用它來還原一些特殊符號(hào)(如上述的 & 和 \ )本身字面上的意義(轉(zhuǎn)義) , 或用它來代表?yè)Q行
  • flag : 主要用它來控制一些替換情況 :
    • 當(dāng) flag 為 g 時(shí) , 代表替換所有符合(match)的字串 。
    • 當(dāng) flag 為十進(jìn)位數(shù)字 m 時(shí) , 代表替換行內(nèi)第 m 個(gè)符合的字串。
    • 當(dāng) flag 為 p 時(shí) , 代表替換第一個(gè)符合 pattern 的字串後 , 將資料輸出標(biāo)準(zhǔn)輸出檔。
    • 當(dāng) flag 為 w wfile 時(shí) , 代表替換第一個(gè)符合 pattern 的字串後 , 輸出到 wfile 檔內(nèi)(如果 wfile 不存在 , 則會(huì)重新開啟名為 wfile 的檔案)。
    • 當(dāng)沒有 flag 時(shí) , 則將資料行內(nèi)第一個(gè)符合 pattern 的字串以 replacement 字串來替換 。
  • delimiter : 在 “/pattern/replace/[flag] ” 中 “/” 被當(dāng)成一 delimiter。除了空白(blank)、換行(newline) 之外 ,使用者可用任何字元作為 delimiter。例如下述編輯指令
    s#/usr#/usr1#g

    上述命令中”#”為 delimiter。如果用 “/” 做 delimiter , 則 sed 會(huì)將 pattern 與 replacement中的 “/” 當(dāng)成 delimiter 而發(fā)生錯(cuò)誤。

3、范例:

  • 題目 : 替換 input.dat 檔(後面如果沒有特別指定 , 均假設(shè)文件檔名為 input.dat)內(nèi) “1996″ 字串成 “1997″ , 同時(shí)將這些資料行存入 year97.dat 檔內(nèi)。
  • 說明 : 用函數(shù)參數(shù) s 指示 sed 將 “1996″ 字串替換成 “1997″ , 另外用 s argument 中的 flag w 指示 sed 將替換過的資料行存入 year97.dat 檔內(nèi)。
  • sed 命令列:
    sed -e 's/1996/1997/w year97.dat' input.dat

數(shù)字標(biāo)志很少使用,在這種情況下,正則表達(dá)式在一行上重復(fù)匹配,而只需對(duì)其中某個(gè)位置的匹配進(jìn)行替換。例如,某輸入行也許包含 [tab](制表符)輸入,也許包含多個(gè)制表位。假設(shè)每行有3個(gè)制表符,并且要用“>”替換第二個(gè)制表位,則可以使用下面的替換命令來完成該功能:

s/[tab]/>/2

“[tab]“表示一個(gè)真正的制表符,而制表符在屏幕上是不可見的。如果輸入是一行的文件,如下所示:

Column1[tab]column2[tab]Column3[tab]Column4

對(duì)這個(gè)文件運(yùn)行以上腳本產(chǎn)生的輸出如下:

Column1[tab]column2>Column3[tab]Column4

注意,如果沒有數(shù)字標(biāo)志,則替換命令只替換第一個(gè)制表符(因此“1”可以被看作是默認(rèn)的數(shù)字標(biāo)志)。
我們可以對(duì)前面的示例做一些改動(dòng),用換行符取代每行上的第二個(gè)制表符。

s/[tab]/\
/2

注意,在反斜杠后面不允許有空格。這個(gè)腳本產(chǎn)生下面的結(jié)果:

Column1[tab]column2
Column3[tab]Column4

d

函數(shù)參數(shù) d 表示刪除資料行 , 其指令格式如下:

[address1[ ,address2]] d

對(duì)上述格式有下面幾點(diǎn)說明:

  1. 函數(shù)參數(shù) d 最多與兩個(gè)位址參數(shù)配合。
  2. sed 執(zhí)行刪除動(dòng)作情況如下 :
    1. 將 pattern space 內(nèi)符合位址參數(shù)的資料刪除。
    2. 將下一筆資料讀進(jìn) pattern space 。
    3. 重新執(zhí)行 sed script。

補(bǔ)遺:刪除命令是一個(gè)可以改變腳本中的控制流的命令。這是因?yàn)橐坏﹫?zhí)行這個(gè)命令,那么在“空的”模式空間(注:不允許在被刪除的行上進(jìn)行進(jìn)一步操作)中就不會(huì)再有命令執(zhí)行。所以,刪除命令會(huì)導(dǎo)致讀取新的輸入行,而編輯腳本則從頭開始新的一輪。重要的是:如果某行匹配了模式中地址(地址參數(shù)),那么就刪除整個(gè)行,而不只是刪除行中匹配的部分(要?jiǎng)h除行的一部分,可以使用替換命令并指定一個(gè)空的替換)。

a

函數(shù)參數(shù) a 表示將資料添加到文件中。其指令格式如下:

[address1] a\         使用者所輸入的資料

對(duì)上述格式有下面幾點(diǎn)說明:

1、函數(shù)參數(shù) a 最多與一個(gè)位址參數(shù)配合。
2、函數(shù)參數(shù) a 緊接著 “\” 字元用來表示此行結(jié)束 , 使用者所輸入的資料必須從下一行輸入。如果資料超過一行 , 則須在每行的結(jié)尾加入”\”。
3、sed 執(zhí)行添加動(dòng)作情況如下 : 當(dāng) pattern space 內(nèi)資料輸出後 , sed 跟著輸出使用者所輸入的資料。
4、范例 :

  • 題目: 添加 “多工作業(yè)系統(tǒng)” 在含 “UNIX” 字串的資料行後。假設(shè) input.dat 檔的內(nèi)容如下 :
    UNIX
  • 說明: 用函數(shù)參數(shù) a 將所輸入的資料添加在含 “UNIX” 字串的資料行後。
  • sed 命令列如下 :
    sed -e '/UNIX/a\
        多工作業(yè)系統(tǒng)
        ' input.dat
        

    執(zhí)行上述命令後 , 其輸出結(jié)果如下 :

    UNIX
        多工作業(yè)系統(tǒng)
        

i

函數(shù)參數(shù) i 表示將資料插入文件中。其指令格式如下:

[address1] i\        使用者所輸入的資料

對(duì)上述格式有下面幾點(diǎn)說明:

1、函數(shù)參數(shù) i 最多與一個(gè)位址參數(shù)配合。
2、函數(shù)參數(shù) i 緊接著 “\” 字元用來表示此行結(jié)束 , 使用者所輸入的資料必須從下一行輸入。如果資料超過一行 , 則須在每行的結(jié)尾加入”\”。
3、sed 執(zhí)行插入動(dòng)作的情況如下 : 在 pattern space 內(nèi)資料輸出前 , sed 先輸出使用者所輸入的資料。
4、范例 :

  • 題目: 將 “文章版權(quán)屬於中央研究院” 插在 input.dat 檔中含 “院長(zhǎng) : 李遠(yuǎn)哲” 的資料行之前。假設(shè) input.dat 檔內(nèi)容如下 :
    院長(zhǎng) : 李遠(yuǎn)哲
  • 說明: 用函數(shù)參數(shù) i 將資料行 “文章版權(quán)屬於中央研究院” 插在含 “院長(zhǎng) : 李遠(yuǎn)哲” 的資料行之前。
  • sed 命令列如下:
    sed -e '/院長(zhǎng):李遠(yuǎn)哲/i\
        文章版權(quán)屬於中央研究院
        ' input.dat

    執(zhí)行上述命令後的輸出如下 :

    文章版權(quán)屬於中央研究院
        院長(zhǎng) : 李遠(yuǎn)哲

c

函數(shù)參數(shù) c 表示改變文件中的資料。其格式如下:

[address1[ ,address2]]c\      使用者所輸入的資料

對(duì)上述格式有下面幾點(diǎn)說明:

1、函數(shù)參數(shù) c 最多與兩個(gè)位址參數(shù)配合。
2、函數(shù)參數(shù) c 緊接著 “\” 字元用來表示此行結(jié)束 , 使用者所輸入的資料必須從下一行輸入。如果資料超過一行 , 則須在每行的結(jié)尾加入”\”。
3、sed 執(zhí)行改變動(dòng)作的情況 : 在 pattern space 內(nèi)資料輸出時(shí) , sed 改變它成為使用者所輸入的資料。

補(bǔ)遺:更改命令清除模式空間,它在空間模式中與刪除命令有同樣的效果。腳本中在更改命令之后的其他命令沒有被提供。
插入命令和追加命令不影響模式空間的內(nèi)容。提供的文本將不匹配腳本中后續(xù)命令中的任何地址,那些命令也不影響該文本。不管什么更改改變了模式空間,所提供的文本仍然會(huì)正確輸出。當(dāng)默認(rèn)的輸出受到抑制時(shí)也是這樣——所提供的文本將被輸出,即時(shí)模式空間不是那樣的。而且,所提供的文本不影響 sed 的內(nèi)部行計(jì)數(shù)器。

p

函數(shù)參數(shù) p 表示印出模式空間中的資料。其指令格式如下 :

[address1[ , address2]] p

對(duì)於上述格式有下面幾點(diǎn)說明 :

1、函數(shù)參數(shù) p 最多與兩個(gè)位址參數(shù)配合。
2、sed 執(zhí)行印出動(dòng)作的情況如下 : sed 拷備一份 pattern space 內(nèi)容至標(biāo)準(zhǔn)輸出檔。
(除非抑制(-n)默認(rèn)的輸出,否則打印命令將輸出行的重復(fù)復(fù)制。當(dāng)抑制默認(rèn)的輸出或者當(dāng)通過程序的流程控制來避免到達(dá)腳本的底部時(shí),可能會(huì)使用它。)

l

函數(shù)參數(shù) l , 除可將模式空間資料中的 nonprinting character(非打印字符) 顯示為兩個(gè)數(shù)字的ASCII 代碼(GNU sed 顯示某些字符,例如,回車符,使用的是 ANSI C 轉(zhuǎn)義序列,而不是八進(jìn)制。)外 , 其於均與函數(shù)參數(shù) p相同。例如 , 將下面 input.dat 檔中的 ^[ 以 ASCII 碼印出

The Great ^[ is a movie starring Steve McQueen.

(在 vi 中的插入模式下通過鍵入 CTRL-V(大小寫無關(guān)),然后按下 ESC 鍵,產(chǎn)生字符 ^[ ,類似的,按下回車鍵可產(chǎn)生字符 ^M,按下 CTRL-A(大小寫無關(guān)),產(chǎn)生字符 ^A,其余類推。)

執(zhí)行命令 sed -e 'l' input.dat 後 , 則輸出結(jié)果如下 :

The Great \033 is a movie starring Steve McQueen.
The Great     is a movie starring Steve McQueen.

上述第二行資料為 sed 的自動(dòng)輸出。
(在 sed 中不能用 ASCII 值匹配字符(也不能匹配八進(jìn)制數(shù)值),所以,使用 sed 替換(或刪除)文檔中的非打印字符,得用 vi 來編輯 sed 的編輯命令腳本,使用命令腳本來執(zhí)行 sed 而無法在命令行上輸入 sed 的命令參數(shù)。)

r

函數(shù)參數(shù) r 表示讀入文件的內(nèi)容到模式空間。其指令格式如下 :

[address1] r file

對(duì)於上述格式有下面幾點(diǎn)說明 :

1、函數(shù)參數(shù) r 最多與一個(gè)位址參數(shù)配合。
2、在指令中 , 函數(shù)參數(shù) r 與文件名稱間 , 必須有一空格(空格后到換行符前的每個(gè)字符都被當(dāng)做文件名,因此,前導(dǎo)的和嵌入的空格也是文件名的一部分)。
3、sed 執(zhí)行讀入動(dòng)作的情況如下 : 在 pattern space 內(nèi)資料輸出後 , sed 讀入由 file 指定的文件的內(nèi)容跟著輸出。當(dāng) file 不存在時(shí) ,sed 照樣執(zhí)行其它指令而不會(huì)有任何錯(cuò)誤訊息產(chǎn)生。

w

函數(shù)參數(shù) w 表示將模式空間的內(nèi)容寫入文件。其指令格式如下 :

[address1[ ,address2]] w file

對(duì)於上述格式有下面幾點(diǎn)說明 :

1、函數(shù)參數(shù) w 最多與兩個(gè)位址參數(shù)配合。
2、在指令中 , 函數(shù)參數(shù) w 與文件名稱間 , 必須有一空格(空格后到換行符前的每個(gè)字符都被當(dāng)做文件名,因此,前導(dǎo)的和嵌入的空格也是文件名的一部分)。
3、sed 執(zhí)行寫出動(dòng)作的情況如 : 將 pattern space 內(nèi)資料寫入文件 file。資料寫入時(shí) , 會(huì)取代(overwrite)原來文件內(nèi)的資料(如果一個(gè)腳本中有多個(gè)指令寫到同一個(gè)文件中,那么每個(gè)寫命令都將內(nèi)容追加到這個(gè)文件中)。另外 , 當(dāng)文件不存在時(shí) , sed 會(huì)重新產(chǎn)生(creat)它。

y

函數(shù)參數(shù) y 表示轉(zhuǎn)換資料中的字元。其指令格式如下 :

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

對(duì)於上述格式有下面幾點(diǎn)說明 :

1、函數(shù)參數(shù)最多配合兩個(gè)位址參數(shù)。
2、指令中 , /abc.../xyz.../(x、y、z、a、b、c 代表某些字元) 為 y 的 argument 。其中 abc... 與xyz... 的字元個(gè)數(shù)必須相同。
3、sed 執(zhí)行轉(zhuǎn)換時(shí) , 將 pattern space 內(nèi)資料內(nèi)的 a 字元轉(zhuǎn)換成 x 字元 、b 字元轉(zhuǎn)換成 y 字元 、c 字元轉(zhuǎn)換成 z 字元 ...。
4、范例:

  • 題目: 將 input.dat 檔中的小寫字母改成大寫。假設(shè) input.dat 檔的內(nèi)容如下 :
    Sodd's Second Law:
        Sooner or later, the worst possible set of
        circumstances is bound to occur.
        
  • 說明:利用函數(shù)參數(shù) y 指示 sed 做字母大小的轉(zhuǎn)換。
  • sed 命令列如下 :
    sed -e '
        y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
        ' input.dat
        

    執(zhí)行上述命令輸出結(jié)果如下 :

    SODD'S SECOND LAW:
        SOONER OR LATER, THE WORST POSSIBLE SET OF
        CIRCUMSTANCES IS BOUND TO OCCUR.
        

!

函數(shù)參數(shù) ! 表示不執(zhí)行函數(shù)參數(shù)。當(dāng)有如下指令時(shí) ,

[address1[ , address2]] ! 函數(shù)參數(shù)

表示 , 對(duì)符合位址參數(shù)之資料不執(zhí)行函數(shù)參數(shù)。例如刪除 , 除了含有 "regular" 字串的資料行外,所有資料行, 則執(zhí)行 ! 后的刪除命令

sed -e '/regular/!d' input.dat

n

函數(shù)參數(shù) n 表示讀入下一行資料。其指令格式如下:

[address1[ ,address2]] n

對(duì)上述格式有下面幾點(diǎn)說明 :

1、函數(shù)參數(shù) n 最多配合兩個(gè)位址參數(shù)。
2、sed 執(zhí)行讀入下一行動(dòng)作的情況如下 :

  1. 輸出在 pattern space 的資料(默認(rèn)輸出)。
  2. 將下一筆資料讀到 pattern space。
  3. 執(zhí)行下一個(gè)編輯指令(不用返回到腳本的頂端)。

補(bǔ)遺:next 命令改變了正常的流控制(正常情況下,直到到達(dá)腳本的底部才會(huì)輸出模式空間的內(nèi)容,總是在讀入新行之后從腳本的頂端開始)。實(shí)際上,next 命令導(dǎo)致輸入的下一行取代模式空間中的當(dāng)前行。腳本中的后續(xù)命令應(yīng)用于替換后的行,而不是當(dāng)前行。如果沒有抑制默認(rèn)輸出,那么在替換發(fā)生之前會(huì)打印當(dāng)前行。在較長(zhǎng)的腳本中,必須記住出現(xiàn)在 next 命令之前的命令不會(huì)應(yīng)用于新的輸入行,而出現(xiàn)在其后面的命令不應(yīng)用于舊的輸入行

3、范例

  • 題目 : 輸出 input.dat 檔內(nèi)偶數(shù)行資料。假設(shè) input.dat 檔內(nèi)容如下:
    The
        UNIX
        Operation
        System
        
  • 說明: 在命令列上
    • 以選項(xiàng) -n , 將資料輸出的控制權(quán)轉(zhuǎn)給指令。
    • 利用函數(shù)參數(shù) n 將下一行資料(偶數(shù)行)取代 pattern space 內(nèi)的資料行(奇數(shù)行)。
    • 利用函數(shù)參數(shù) p 將 pattern space 內(nèi)的資料(偶數(shù)行)輸出。

    最後 , 整個(gè)輸出只有原先檔內(nèi)的偶數(shù)行資料。

  • sed 命令列如下 :
    sed -n -e 'n' -e 'p' input.dat

    執(zhí)行上述命令後 , 輸出的結(jié)果如下 :

    UNIX
        System

q

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

[address1] q

對(duì)上述格式有下面幾點(diǎn)說明 :

1、函數(shù)參數(shù) q 最多配合一個(gè)位址參數(shù)。
2、sed 執(zhí)行跳離動(dòng)作時(shí) , 它停止讀取新的輸入行(并停止將它們發(fā)送到輸出)。
(退出命令 q 只適用于單行的地址。一旦找到和 address 匹配的行,那么腳本就結(jié)束。注:需要小心的是,在將編輯操作寫回到原始文件的任何程序中不要使用 q 命令。在執(zhí)行 q 命令之后,就不會(huì)再產(chǎn)生輸出。在想要編輯文件的一部分并保留剩余部分不改變的情況下,不要使用 q 命令。這種情況下使用 q 時(shí)初學(xué)者常犯的非常危險(xiǎn)的錯(cuò)誤。)

示例,下面一行命令使用退出命令從文件中打印前100行:

$ sed '100q' test
...

它打印每一行,直到它到達(dá)行100并且退出。在這點(diǎn)上,這個(gè)命令的功能與 UNIX 的 head 命令類似。
quit 的另一個(gè)可能的用法是從文件中提取了想要的內(nèi)容后退出腳本。

3、范例 :

  • 題目: 對(duì)文件檔執(zhí)行 script_file 內(nèi)的編輯指令 , 除非遇到 "Linux" 字串。
  • 說明: 無論 script_file 內(nèi)是何種指令 , 使用者只要在命令列上用指令/Linux/q , 函數(shù)參數(shù) q 會(huì)強(qiáng)迫 sed 遇到 "Linux" 時(shí)做跳離動(dòng)作。
  • sed 命令列如下 :
    sed -e '/Linux/q' -f script_file input.dat

=

函數(shù)參數(shù) = 表示印出資料的行號(hào)。其指令格式如下:

[address1[ ,address2]] =

對(duì)上述格式有下面幾點(diǎn)說明 :

1、函數(shù)參數(shù) = 最多配合兩個(gè)位址參數(shù)。
2、執(zhí)行時(shí) , 行號(hào)將在資料輸出前先輸出。
3、范例 :

  • 題目: 印出 input.dat 檔內(nèi)資料行數(shù)。假設(shè) input.dat 的內(nèi)容如下 :
    The UNIX
        Operating System
  • 說明 : 用函數(shù)參數(shù) = 來印出資料的行數(shù)。
  • sed 命令列如下 :
    sed -e '=' input.dat

    執(zhí)行上述命令後 , 輸出的結(jié)果如下 :

    1
        The UNIX
        2
        Operating System

#

在 script file 內(nèi) , 函數(shù)參數(shù) # 後的文字為注解。當(dāng)注解文字超過多行時(shí) , 其行間須以 "\" 換行字元相隔。在 sed 的System V版本中,注釋只允許出現(xiàn)在第一行。而 GNU sed 則可以在腳本的任何地方放置注釋,甚至是跟在命令行的后面。注釋行的第一個(gè)字符必須是“#”號(hào)。如果跟在#后面的下一個(gè)字符是 n,那么腳本不會(huì)自動(dòng)產(chǎn)生輸出。這和指定命令行選項(xiàng) -n 是等價(jià)的。跟在 n 后面的其余內(nèi)容被看做是注釋。在POSIX標(biāo)準(zhǔn)中,采用這種方式的 #n 必須是文件的前兩個(gè)字符

到此為止,前面介紹的命令(函數(shù)參數(shù))可歸類為基本的 sed 命令,下面將要介紹的這些命令可歸類為 sed 的高級(jí)命令。sed 的高級(jí)命令可分成3個(gè)組:
1、處理多行模式空間(N、D、P)。
2、采用保持空間來保存模式空間的內(nèi)容并使它可用于后續(xù)的命令(H、h、G、g、x)。
3、編寫使用分支和條件指令的腳本來更改控制流(:、b、t)。

多行模式空間
在前面的正則表達(dá)式討論中,我們強(qiáng)調(diào)模式匹配是面向行的。像 grep 這樣的程序嘗試在單個(gè)輸入行上匹配一個(gè)模式。這就使它很難匹配一個(gè)在一行的結(jié)尾處開始,并在下一行的開始處結(jié)束的短語(yǔ)。其他一些模式只有當(dāng)在多行上匹配才有意義。
sed 能查看模式空間的多個(gè)行。這就允許匹配模式擴(kuò)展到多行上。下面我們將要介紹創(chuàng)建多行模式空間并處理它的內(nèi)容的命令。這里的 3 個(gè)多行命令(N、D、P)對(duì)應(yīng)于前面介紹的小寫字母的基本命令(n、d、p)。

N

函數(shù)參數(shù) N 表示添加下一筆資料在 pattern space 內(nèi)。其指令格式如下:

[address1[ ,address2]] N

對(duì)上述格式有下面幾點(diǎn)說明 :

1、函數(shù)參數(shù) N 最多配合兩個(gè)位址參數(shù)。
2、sed 執(zhí)行時(shí) , 將下一行資料讀入并添加在 pattern space 內(nèi) , 資料行間以換行字元(embedded newline character)分隔。此外 , 在替換時(shí) , 換行字元可用轉(zhuǎn)義序列 \n 來匹配。

在多行模式空間中,元字符“^”匹配模式空間中的第一個(gè)字符,而不匹配換行符后面的字符。同樣,“$”只匹配模式空間中最后的換行符,而不匹配任何嵌入的換行符。在執(zhí)行 Next 命令之后,控制將被傳遞給腳本中的后續(xù)命令(同 next )。Next 命令與 next 命令不同,next 輸出模式空間的內(nèi)容,然后讀取新的輸入行。next 命令不創(chuàng)建多行模式空間。

3、范例 :

  • 題目: 將下述兩行資料合。假設(shè) input.dat 的內(nèi)容如下 :
    The UNIX
        Operating System
  • 說明 : 先利用函數(shù)參數(shù) N 將兩行資料置於 pattern space 內(nèi) , 在利用函數(shù)參數(shù) s/\n/ / 將兩行資料間的分隔符 \n 以空白替代 , 如此兩行資料變成一行輸出。
  • sed 命令列如下 :
    sed -e 'N' -e 's/\n/ /' input.dat

    執(zhí)行上述命令後 , 其輸出的結(jié)果如下:

    The UNIX Operating System

D

函數(shù)參數(shù) D 表示刪除 pattern space 內(nèi)的第一行資料(刪除模式空間中直到第一個(gè)嵌入的換行符的這部分內(nèi)容)。其指令格式如下:

[address1[ ,address2]]D

對(duì)上述格式有下面幾點(diǎn)說明 :

1、函數(shù)參數(shù) D 最多配合兩個(gè)位址參數(shù)。
2、函數(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 (返回到腳本的頂端,將這些指令應(yīng)用于模式空間剩余的內(nèi)容);d 則讀入下一行后重新執(zhí)行 sed script(返回到腳本的頂端)。

P

函數(shù)參數(shù) P 表示印出 pattern space 內(nèi)的第一行資料(輸出多行模式空間的第一部分,直到第一個(gè)嵌入的換行符為止)。其指令格式如下:

[address1[ ,address2]] P

對(duì)上述格式有下面幾點(diǎn)說明 :

1、函數(shù)參數(shù) P 最多配合兩個(gè)位址參數(shù)。
2、P 與 p , 除了面對(duì)的 pattern space 內(nèi)的資料行數(shù)不同外 , 其它均相同。

在執(zhí)行完腳本的最后一個(gè)命令之后,模式空間的內(nèi)容自動(dòng)輸出(-n 選項(xiàng)或 #n 抑制這個(gè)默認(rèn)的動(dòng)作)。因此當(dāng)默認(rèn)的輸出被抑制或者腳本中的控制流更改,以至不能達(dá)到腳本的底部時(shí),需要使用打印命令(P 或 p)。Print 命令經(jīng)常出現(xiàn)在 Next 命令之后和 Delete 命令之前。這 3 個(gè)命令能建立一個(gè)輸入/輸出循環(huán),用來維護(hù)兩行的模式空間,但是一次只輸出一行。這個(gè)循環(huán)的目的是只輸出模式空間的第一行,然后返回到腳本的頂端將所有的命令應(yīng)用于模式空間的第二行。沒有這個(gè)循環(huán),當(dāng)執(zhí)行腳本中的最后一個(gè)命令時(shí),模式空間中的這兩行都被輸出。

3、范例:

  • 題目 : 輸出 input.dat 檔內(nèi)奇數(shù)行資料。假設(shè) input.dat 檔內(nèi)容如下:
    The
        UNIX
        System
  • 說明: 在命令列上
    • 以選項(xiàng) -n , 將資料輸出的控制權(quán)轉(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' input.dat

    執(zhí)行上述命令後 , 輸出的結(jié)果如下 :

    The
        System

模式空間與保持空間

模式空間的內(nèi)容可以復(fù)制到保持空間,而且保持空間的內(nèi)容也可以復(fù)制到模式空間。有一組命令用于在保持空間和模式空間之間移動(dòng)數(shù)據(jù)。保持空間用于臨時(shí)存儲(chǔ)。單獨(dú)的命令不能尋址保持空間或者更改它的內(nèi)容。

保持空間最常見的用途是,當(dāng)改變模式空間中的原始內(nèi)容時(shí),用于保留當(dāng)前輸入行的副本。影響模式空間的命令有:

命令           縮寫            功能
Hold           h 或 H         將模式空間的內(nèi)容復(fù)制或追加到保持空間
Get            g 或 G         將保持空間的內(nèi)容復(fù)制或追加到模式空間
Exchang        x              交換模式空間和保持空間的內(nèi)容

hold(h,H)命令將數(shù)據(jù)移至保持空間,而 get(g,G)命令將保持空間的數(shù)據(jù)移回到模式空間。同一命令的小寫字母和大寫字母之間的差別是,小寫字母命令改寫目的緩存區(qū)的內(nèi)容,而大寫字母命令追加緩存區(qū)的現(xiàn)有內(nèi)容。

hold(小寫)命令用模式空間的內(nèi)容取代保持空間的內(nèi)容。get(小寫) 命令用保持空間的內(nèi)容取代模式空間的內(nèi)容。
Hold(大寫)命令在保持空間的內(nèi)容之后放置一個(gè)換行符,且后面跟隨模式空間的內(nèi)容(即使保持空間是空的,換行符也被追加到保持空間)。Get(大寫)命令在模式空間的內(nèi)容之后放置一個(gè)換行符,且后面跟隨保持空間的內(nèi)容。

交換命令交換兩個(gè)緩存區(qū)的內(nèi)容。對(duì)兩個(gè)緩存區(qū)沒有副作用。

h

函數(shù)參數(shù) h 表示暫存 pattern space 的資料至 hold space。其指令格式如下:

[address1[ ,address2]] h

對(duì)上述格式有下面幾點(diǎn)說明 :

1、函數(shù)參數(shù) h 最多配合兩個(gè)位址參數(shù)。
2、sed 執(zhí)行暫存動(dòng)作時(shí) , 會(huì)蓋掉(overwrite) hold space 內(nèi)原來的資料。
3、當(dāng) sed 全部執(zhí)行結(jié)束時(shí) , hold space 內(nèi)資料會(huì)自動(dòng)清除。

H
函數(shù)參數(shù) H 與 h 唯一差別是 , sed 執(zhí)行 h 時(shí) , 資料蓋掉(overwrite) hold space 內(nèi)原來的資料 ,而 H , 資料則是 "添加(append)" 在 hold space 原來資料後。

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) pattern space 內(nèi)原來的資料。

G
函數(shù)參數(shù) G 與 g 唯一差別是 , sed 執(zhí)行 g 時(shí) , 資料蓋掉(overwrite) pattern space 內(nèi)原來的資料 , 而 G , 資料則是 "添加(append)" 在 pattern space 原來資料後。

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 來配合。其中 , 以函數(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

高級(jí)流程控制指令

分支(b)和測(cè)試(t)命令將腳本中的控制轉(zhuǎn)移到包含特殊標(biāo)簽的行。如果沒有指定標(biāo)簽,則將控制轉(zhuǎn)移到腳本的結(jié)尾處。分支命令用于無條件轉(zhuǎn)移,測(cè)試命令用于有條件轉(zhuǎn)移,它們只有當(dāng)替換命令改變當(dāng)前行時(shí)才會(huì)執(zhí)行。
標(biāo)簽是任意不多于7個(gè)字符的序列(GNU sed 允許標(biāo)簽為任意長(zhǎng)度)。標(biāo)簽本身占據(jù)一行并以冒號(hào)開始:

:mylabel

在冒號(hào)和標(biāo)簽之間不允許有空格。行結(jié)尾處的空格將被認(rèn)為是標(biāo)簽的一部分。當(dāng)在分支命令或測(cè)試命令中指定標(biāo)簽時(shí),在命令和標(biāo)簽之間允許有空格:

b mylabel

注意,不要在標(biāo)簽后面插入空格。

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)設(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)。
范例 :

  • 題目: 將 input.dat 檔內(nèi)資料行的開頭字母重覆印 40 次。假設(shè) input.dat 檔的內(nèi)容如下 :
    A
        B
        C
  • 說明: 用指令 b p1 與 :p1 構(gòu)成執(zhí)行增加字母的回圈(loop) , 同時(shí)在字母出現(xiàn) 40 個(gè)時(shí) , 也用指令 b 來跳出圈。下面就以檔內(nèi)第一行資料 "A" 為例 , 描述它如何連續(xù)多添加 39 個(gè) "A" 在同一行:
    • 用指令 s/A/AA/ 將 "A" 替換成 "AA"。
    • 用指令 b p1 與 :p1 構(gòu)成回圈(loop) , 它目的使上述動(dòng)作被反覆的執(zhí)行。每執(zhí)行一次圈 , 則資料行上的 "A" 就多出一個(gè)。例如 , 第一次圈資料行變成 "AA" , 第二次圈資料行變成 "AAA" ...。
    • 用指令 [ABC]\{40\}/b (注解:\{重復(fù)次數(shù)\} 、\{下限,上限\})來作為停止回圈的條件。當(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
        

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。
范例:

  • 題目 : 將 input.dat 檔中資料 A1 替換成 C1、C1 替換成 B1、B1 替換成 A1。input.dat 檔的內(nèi)容如下:
    代號(hào)
        B1
        A1
        B1
        C1
        A1
        C1
        
  • 說明 : 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
posted on 2010-04-28 16:47 elprup 閱讀(571) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Unix 命令
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩三级电影在线| 久久精品视频va| 国产精品三级久久久久久电影| 麻豆精品精品国产自在97香蕉| 久久精品亚洲| 久久只有精品| 欧美经典一区二区三区| 欧美日韩一二三四五区| 国产精品乱码| 影视先锋久久| 日韩亚洲视频| 欧美有码在线观看视频| 久久久五月天| 亚洲精品国产欧美| 亚洲视频免费在线| 久久久噜噜噜久噜久久| 欧美激情黄色片| 国产精品乱子乱xxxx| 亚洲影院色在线观看免费| 午夜日韩在线观看| 免费不卡亚洲欧美| 国产精品v欧美精品v日韩精品| 国产精品一区二区在线观看| 亚洲成人影音| 亚洲一区二区三区中文字幕在线| 久久久久久久国产| 日韩性生活视频| 久热精品视频在线观看| 欧美视频国产精品| 亚洲国产精品久久久久秋霞影院| 亚洲女性裸体视频| 欧美高清视频在线| 欧美一区二区视频在线观看2020| 欧美日本国产精品| 在线成人激情视频| 午夜精品久久久久久久99樱桃 | 国内外成人免费激情在线视频| 亚洲精品少妇网址| 久久人人看视频| 亚洲欧美日韩综合| 欧美日韩国产精品一区二区亚洲| 精品成人在线观看| 欧美影院一区| 亚洲少妇自拍| 欧美日韩一级片在线观看| 亚洲激情视频在线播放| 久久久久看片| 欧美一级视频免费在线观看| 国产精品久久久久久久久久久久久 | 欧美在线一区二区三区| 国产精品国产三级国产专播精品人| 亚洲国产欧美日韩精品| 蜜桃av噜噜一区| 欧美一区二区私人影院日本 | 欧美国产第二页| 久久久精品日韩欧美| 国产一区二区三区视频在线观看| 性欧美暴力猛交另类hd| 亚洲一区二区黄色| 国产精品欧美精品| 性欧美办公室18xxxxhd| 午夜亚洲福利| 激情懂色av一区av二区av| 久久免费高清| 蜜桃av噜噜一区| 最新国产成人在线观看| 亚洲高清成人| 亚洲网站视频福利| 国内精品久久久久影院薰衣草 | 91久久香蕉国产日韩欧美9色 | 亚洲自拍高清| 国产日韩成人精品| 久久久免费精品视频| 久久久国产91| 亚洲精品资源| 一区二区三区欧美在线观看| 国产精品一级二级三级| 久久久999| 欧美成人69| 亚洲综合好骚| 久久精品欧美日韩精品| 亚洲伦理在线免费看| 亚洲午夜激情| 亚洲第一视频| 亚洲视频一起| 伊人久久综合| 夜夜夜久久久| 在线免费观看成人网| 日韩午夜在线观看视频| 国产亚洲精品一区二区| 91久久久亚洲精品| 国产日韩一级二级三级| 亚洲国产精品123| 国产精品一区三区| 亚洲国产精品一区二区久| 国产精品免费福利| 欧美刺激性大交免费视频| 国产精品白丝av嫩草影院| 欧美~级网站不卡| 国产精品video| 欧美阿v一级看视频| 国产精品国产三级国产普通话蜜臀 | 欧美日韩一区在线观看| 久久免费视频在线| 欧美日韩一二三四五区| 欧美成人精品1314www| 国产精品一区三区| 亚洲老司机av| 亚洲黑丝在线| 久久精品九九| 欧美在线视频一区二区三区| 欧美日韩成人网| 欧美高清视频在线播放| 国产自产在线视频一区| 99pao成人国产永久免费视频| 狠狠网亚洲精品| 亚洲一区一卡| 亚洲一区二区欧美日韩| 欧美国产一区视频在线观看| 久久青草久久| 国产综合久久久久久| 亚洲综合大片69999| 亚洲一区www| 欧美日韩精品在线视频| 亚洲国产婷婷综合在线精品 | 亚洲一区二区黄色| 另类专区欧美制服同性| 久久精品视频在线播放| 国产精品青草久久| 亚洲视频碰碰| 亚洲制服欧美中文字幕中文字幕| 欧美激情 亚洲a∨综合| 欧美激情一区二区三区在线| 黄页网站一区| 久久精品一级爱片| 久久综合影视| 亚洲风情亚aⅴ在线发布| 久久欧美中文字幕| 欧美a级理论片| 91久久精品一区二区别| 蜜臀a∨国产成人精品| 欧美电影免费观看大全| 黄网站色欧美视频| 快播亚洲色图| 亚洲国产国产亚洲一二三| 亚洲精品国产精品国自产在线 | 亚洲激情成人网| 欧美成人一区二免费视频软件| 欧美国产第一页| 99re成人精品视频| 国产精品国产亚洲精品看不卡15| 亚洲性夜色噜噜噜7777| 久久久久国产精品www| 一区二区三区亚洲| 男人的天堂亚洲在线| 亚洲精品网址在线观看| 亚洲欧美日韩精品久久久久| 国产情侣一区| 欧美jizz19hd性欧美| 9久re热视频在线精品| 小处雏高清一区二区三区| 黄色工厂这里只有精品| 欧美精品性视频| 亚洲欧美日韩区| 亚洲第一搞黄网站| 亚洲一区二区三区四区五区午夜| 国产午夜精品久久| 欧美激情一区二区三区不卡| 这里只有精品丝袜| 欧美成在线观看| 亚洲欧美日韩国产一区二区三区| 国产在线乱码一区二区三区| 欧美精品激情blacked18| 亚洲欧美不卡| 亚洲国产精品欧美一二99| 午夜精品久久久久久久蜜桃app| 在线看片成人| 国产喷白浆一区二区三区 | 国产日韩欧美在线视频观看| 蜜桃精品一区二区三区| 亚洲欧美另类国产| 亚洲精品社区| 欧美成人在线网站| 欧美一区2区三区4区公司二百| 亚洲国产日韩欧美在线99| 国产欧美精品va在线观看| 免费久久精品视频| 久久不射电影网| 一区二区三区视频免费在线观看| 欧美国产日本高清在线| 性色av一区二区怡红| 日韩系列欧美系列| 在线观看精品视频| 久久久久国产一区二区三区四区| 亚洲精品色图| 亚洲国产欧美一区二区三区久久 | 亚洲精品三级| 欧美大片一区二区| 免费观看亚洲视频大全| 久久黄色级2电影|