• <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>

            c++實例研究

            從0開始

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

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


            本章將以一節(jié)一個函數(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é)中 , 首先簡單介紹函數(shù)參數(shù)功能 , 接著說明函數(shù)參數(shù)與位址參數(shù)配合的格式 ,而其中也一并描述 sed 執(zhí)行此函數(shù)參數(shù)的工作情形。

            s

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

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

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

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

            • 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ù)字)個 \( 、\) 所括起來的字串。例如
                sed -e 's/\(test\) \(my\) \(car\)/[\2 \3 \1]/' 資料檔名

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

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

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

            3、范例:

            • 題目 : 替換 input.dat 檔(後面如果沒有特別指定 , 均假設(shè)文件檔名為 input.dat)內(nèi) “1996″ 字串成 “1997″ , 同時將這些資料行存入 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)志很少使用,在這種情況下,正則表達式在一行上重復(fù)匹配,而只需對其中某個位置的匹配進行替換。例如,某輸入行也許包含 [tab](制表符)輸入,也許包含多個制表位。假設(shè)每行有3個制表符,并且要用“>”替換第二個制表位,則可以使用下面的替換命令來完成該功能:

            s/[tab]/>/2

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

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

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

            Column1[tab]column2>Column3[tab]Column4

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

            s/[tab]/\
            /2
            

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

            Column1[tab]column2
            Column3[tab]Column4
            

            d

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

            [address1[ ,address2]] d

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

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

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

            a

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

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

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

            1、函數(shù)參數(shù) a 最多與一個位址參數(shù)配合。
            2、函數(shù)參數(shù) a 緊接著 “\” 字元用來表示此行結(jié)束 , 使用者所輸入的資料必須從下一行輸入。如果資料超過一行 , 則須在每行的結(jié)尾加入”\”。
            3、sed 執(zhí)行添加動作情況如下 : 當(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\        使用者所輸入的資料

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

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

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

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

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

            c

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

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

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

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

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

            p

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

            [address1[ , address2]] p

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

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

            l

            函數(shù)參數(shù) l , 除可將模式空間資料中的 nonprinting character(非打印字符) 顯示為兩個數(shù)字的ASCII 代碼(GNU sed 顯示某些字符,例如,回車符,使用的是 ANSI C 轉(zhuǎ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 的自動輸出。
            (在 sed 中不能用 ASCII 值匹配字符(也不能匹配八進制數(shù)值),所以,使用 sed 替換(或刪除)文檔中的非打印字符,得用 vi 來編輯 sed 的編輯命令腳本,使用命令腳本來執(zhí)行 sed 而無法在命令行上輸入 sed 的命令參數(shù)。)

            r

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

            [address1] r file

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

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

            w

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

            [address1[ ,address2]] w file

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

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

            y

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

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

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

            1、函數(shù)參數(shù)最多配合兩個位址參數(shù)。
            2、指令中 , /abc.../xyz.../(x、y、z、a、b、c 代表某些字元) 為 y 的 argument 。其中 abc... 與xyz... 的字元個數(shù)必須相同。
            3、sed 執(zhí)行轉(zhuǎn)換時 , 將 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)有如下指令時 ,

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

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

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

            n

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

            [address1[ ,address2]] n

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

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

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

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

            3、范例

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

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

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

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

              UNIX
                  System

            q

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

            [address1] q

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

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

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

            $ sed '100q' test
            ...
            

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

            3、范例 :

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

            =

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

            [address1[ ,address2]] =

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

            1、函數(shù)參數(shù) = 最多配合兩個位址參數(shù)。
            2、執(zhí)行時 , 行號將在資料輸出前先輸出。
            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)注解文字超過多行時 , 其行間須以 "\" 換行字元相隔。在 sed 的System V版本中,注釋只允許出現(xiàn)在第一行。而 GNU sed 則可以在腳本的任何地方放置注釋,甚至是跟在命令行的后面。注釋行的第一個字符必須是“#”號。如果跟在#后面的下一個字符是 n,那么腳本不會自動產(chǎn)生輸出。這和指定命令行選項 -n 是等價的。跟在 n 后面的其余內(nèi)容被看做是注釋。在POSIX標(biāo)準中,采用這種方式的 #n 必須是文件的前兩個字符

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

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

            N

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

            [address1[ ,address2]] N

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

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

            在多行模式空間中,元字符“^”匹配模式空間中的第一個字符,而不匹配換行符后面的字符。同樣,“$”只匹配模式空間中最后的換行符,而不匹配任何嵌入的換行符。在執(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)的第一行資料(刪除模式空間中直到第一個嵌入的換行符的這部分內(nèi)容)。其指令格式如下:

            [address1[ ,address2]]D

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

            1、函數(shù)參數(shù) D 最多配合兩個位址參數(shù)。
            2、函數(shù)參數(shù) D 與 d 的比較如下 :

            • 當(dāng) pattern space 內(nèi)只有一資料行時 , D 與 d 作用相同。
            • 當(dāng) pattern space 內(nèi)有多行資料行時
              • 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)的第一行資料(輸出多行模式空間的第一部分,直到第一個嵌入的換行符為止)。其指令格式如下:

            [address1[ ,address2]] P

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

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

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

            3、范例:

            • 題目 : 輸出 input.dat 檔內(nèi)奇數(shù)行資料。假設(shè) input.dat 檔內(nèi)容如下:
              The
                  UNIX
                  System
            • 說明: 在命令列上
              • 以選項 -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ù)行)則被放棄輸出。最後 , 整個輸出只有原先的奇數(shù)行資料。

            • sed 命令列 :
              sed -n -e 'N' -e 'P' input.dat

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

              The
                  System

            模式空間與保持空間

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

            保持空間最常見的用途是,當(dāng)改變模式空間中的原始內(nèi)容時,用于保留當(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)容之后放置一個換行符,且后面跟隨模式空間的內(nèi)容(即使保持空間是空的,換行符也被追加到保持空間)。Get(大寫)命令在模式空間的內(nèi)容之后放置一個換行符,且后面跟隨保持空間的內(nèi)容。

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

            h

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

            [address1[ ,address2]] h

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

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

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

            g

            函數(shù)參數(shù) g 表示與函數(shù)參數(shù) h 相反的動作 , 它表示將 hold space 內(nèi)資料放回 pattern space內(nèi)。其指令格式如下 :

            [address1[ ,address2]]g

            函數(shù)參數(shù) g 最多配合兩個位址參數(shù)。
            sed 執(zhí)行放回動作時 , 資料蓋掉(overwrite) pattern space 內(nèi)原來的資料。

            G
            函數(shù)參數(shù) G 與 g 唯一差別是 , sed 執(zhí)行 g 時 , 資料蓋掉(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ù) 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

            高級流程控制指令

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

            :mylabel

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

            b mylabel

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

            b、:label

            函數(shù)參數(shù) : 與函數(shù)參數(shù) b 可在 sed script 內(nèi)建立類似 BASIC 語言中 GOTO 指令的功能。其中 , 函數(shù)參數(shù) : 建立標(biāo)記;函數(shù)參數(shù) b 將下一個執(zhí)行的指令 branch 到標(biāo)記處執(zhí)行。函數(shù)參數(shù) : 與 b , 在 script file 內(nèi)配合的情況如下

                               .
            .
            .
            編輯指令m1
            :記號
            編輯指令m2
            .
            .
            .
            [address1[ ,address2]]b [記號]
            

            其中 , 當(dāng) sed 執(zhí)行至指令 [address1[ ,address2]]b [記號] 時 , 如 pattern space 內(nèi)的資料符合位址參數(shù) , 則 sed 將下一個執(zhí)行的位置 branch 至由 :記號設(shè)定的標(biāo)記處 , 也就是再由 "編輯指令 m2" ... 執(zhí)行。另外 , 如果指令中函數(shù)參數(shù) b 後沒有記號 , 則 sed 將下一個執(zhí)行的指令 branch 到 script file 的最後 , 利用此可使 sed script 內(nèi)有類似 C 語言中的 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) , 同時在字母出現(xiàn) 40 個時 , 也用指令 b 來跳出圈。下面就以檔內(nèi)第一行資料 "A" 為例 , 描述它如何連續(xù)多添加 39 個 "A" 在同一行:
              • 用指令 s/A/AA/ 將 "A" 替換成 "AA"。
              • 用指令 b p1 與 :p1 構(gòu)成回圈(loop) , 它目的使上述動作被反覆的執(zhí)行。每執(zhí)行一次圈 , 則資料行上的 "A" 就多出一個。例如 , 第一次圈資料行變成 "AA" , 第二次圈資料行變成 "AAA" ...。
              • 用指令 [ABC]\{40\}/b (注解:\{重復(fù)次數(shù)\} 、\{下限,上限\})來作為停止回圈的條件。當(dāng)資料行有連續(xù) 40 個 A 出現(xiàn)時 , 函數(shù)參數(shù) b 將執(zhí)行的指令跳到最後 , 停止對此行的編輯。

              同樣 , 對其它資料行也如同上述的方式執(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 前 , 會先去測試其前的替換指令有沒有執(zhí)行替換成功外。在 script file 內(nèi)的情況如下:

                               .
            .
            .
            編輯指令m1
            :記號
            編輯指令m2
            .
            .
            .
            s/.../.../
            [address1[ ,address2]]t [記號]
            編輯指令m3
            

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

            • 題目 : 將 input.dat 檔中資料 A1 替換成 C1、C1 替換成 B1、B1 替換成 A1。input.dat 檔的內(nèi)容如下:
              代號
                  B1
                  A1
                  B1
                  C1
                  A1
                  C1
                  
            • 說明 : input.dat 檔中全部資料行只需要執(zhí)行一次替換動作 , 但為避免資料被替換多次 , 所以利用函數(shù)參數(shù) t 在 sed script 內(nèi)形成一類似 C 語言中 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) 評論(0)  編輯 收藏 引用 所屬分類: Unix 命令
            亚洲欧美久久久久9999 | 精品无码久久久久国产动漫3d| 日韩亚洲国产综合久久久| 97精品伊人久久大香线蕉| 精品无码久久久久久午夜| 国产成人精品久久亚洲高清不卡| 欧洲性大片xxxxx久久久| 国产精品一区二区久久不卡 | 久久国产精品二国产精品| 波多野结衣久久精品| 91久久香蕉国产熟女线看| 国产精品久久久久久久人人看 | 国产∨亚洲V天堂无码久久久| 久久久91人妻无码精品蜜桃HD| 亚洲精品无码久久一线| 久久亚洲中文字幕精品一区| 国内精品久久久久影院优| 亚洲午夜无码AV毛片久久| 狠狠色丁香婷婷久久综合不卡| 亚洲婷婷国产精品电影人久久| 精品久久久久一区二区三区| 久久综合88熟人妻| 色天使久久综合网天天| 久久99精品久久久久久不卡| 久久ZYZ资源站无码中文动漫 | 2021国产精品久久精品| 国产精品久久久天天影视香蕉| 奇米影视7777久久精品| 久久99久国产麻精品66| 久久婷婷五月综合国产尤物app | 久久人爽人人爽人人片AV| 久久国产欧美日韩精品免费| 国内精品久久久久久中文字幕| 久久婷婷国产麻豆91天堂| 国产精品久久久久久久久鸭| 欧美日韩中文字幕久久伊人| 国内精品九九久久久精品| 91精品国产91久久久久福利| 久久精品成人国产午夜| 99久久成人18免费网站| 色99久久久久高潮综合影院|