編寫sed腳本

sed命令
正則表達式

在腳本中應用命令:shell

替換命令
編程

 s/pig/cow/g安全

 s/cow/horse/gbash

模式空間編輯器

sed維護一種模式空間,即一個工做區或者臨時緩衝區,當應用編輯命令時,將在那裏存儲單個輸入行。
ide

注意:一次一行的設計的一個優勢是sed在讀取很是大的文件時不會出現問題。屏幕編輯程序必須將整個文件讀入內存,這將會產生內存溢出或者在處理龐大的文件時速度很是慢。測試

尋址上的全局透視ui

sed是隱式全局的,例以下面的替換命令,將每一個"CA"替換成"California"編碼

s/CA/Californai/g

咱們也能夠限制只對包含"Sebastopol"的行纔將"CA"替換爲"California"

Sebastopol/s/CA/California/g

由「Sebastopol」「CA」組成的輸入行將匹配這個地址,而且應用替換命令將他替換爲「Sebastopol」「California」. 右「San Fracicso」「CA」組成的行不會被匹配,並且不會應用替換命令。

sed命令能夠指定零個、一個或兩個地址。每一個地址都是一個描述模式。行號或者行尋址符號的正則表達式。

注意:

一、若是沒有指定地址,那麼命令將應用於每一行。

二、若是隻有一個地址,那麼命令應用於與這個地址匹配的任意行。

三、若是指定了由逗號分隔的兩個地址,那麼命令應用於匹配第一個地址的第一行,和他後面的行,直到匹配第二個地址的行。

四、若是地址後面跟有感嘆號(!),那麼命令就應用於不匹配該地址的全部行。


刪除命令d
1.一個只有d命令組成,而且沒有地址的腳本不會產生輸出,由於它刪除了全部的行。
2.當行號做爲一個地址提供時,命令隻影響那一行,例如:1d ,刪除最後一行,使用$d
3.當正則表達式做爲地址提供時,這個命令隻影響與這個模式匹配的行。正則表達式必須封閉在(/)中,下面的刪除命令爲"/^$/d" :只刪除空行。
4.若是提供了兩個地址,那麼就指定了命令執行的行範圍。下面展現瞭如何刪除由一對宏包圍的全部行,在這種狀況下,.TS和.TE標記了tb1的輸入:/^\.TS/,/^.TE/d

      注意:它刪除了從第一種模式匹配的行開始,到由第二種模式匹配的行(包括此行在內)爲止的全部的行這個範圍的行不受影響。

5.下面的命令刪除了文件中從行50到最後一行的全部行:50,$d

能夠混合使用行地址和模式地址:1,/^$/d 這個示例刪除了從第一行直到第一個空行的全部的行,例如,能夠用他來刪除保存在文件中的Internet郵件消息中的郵件頭。

注意:1.能夠把第一個地址看作是啓用地址,並把第二個地址當作是禁用動做,sed沒有辦法先行決定第二個地址是否會匹配。一旦匹配了第一個地址,這個動做就將應用於這些行。因而命令應用於「全部」隨後的行,直到第二個地址被匹配。,在上例中,若是文件不包含空行,那麼將刪除全部的行。

2.跟在地址後面的感嘆號會反轉匹配的意義。例如,下面的腳本將刪除在tb1輸入塊中的那些行之外的全部行。/^\.TS/,/^.TE/!d

命令分組

1.sed使用大括號({})將一個地址嵌入在另外一個地址中,或者在相同的地址上應用多個命令。若是想指定行的範圍,而後在這個範圍內指定另外一個地址,則能夠嵌套地址。例如:爲了只刪除tb1輸入塊中的空行,使用下面的命令:/^\.TS/,/^\.TE/{

/^$/d

}

注意:左大括號必須在行末,並且右大括號自己必須單獨佔一行,而且確保在大括號以後沒有空格。

2.可使用大括號將編輯命令括起來對某個範圍的行應用多個命令,以下所示:

/^\.TS/,/^\.TE/{

/^$/d

s/^\.ps 10/.ps 8/

s/^\.vs 12/.vs 10/

}

注意:這個示例不只刪除了tb1輸入塊中的空行,並且他還使用了替換命令s,改變了幾個troff的請求,這些命令只應用於.TS/.TE塊中的行。


測試並保存輸出

在前面關於模式空間的討論中,能夠看到sed:

  1. 生成輸入行的備份

  2. 修改模式空間中的備份

  3. 將備份輸出到標準輸出

這些都意味着sed有其內置的安全措施,因此會改變原始的文件。所以,下面的命令行:

sed -f sedscr testfile:不會在testfile中作改動。它將全部的行送往標準輸出(通常指屏幕),----包括被修改的行和沒有被修改的行。若是想要保存這些輸出,就必須將他們輸入到一個新的文件中。

sed -f sedscr testfile  > newfile 其中,重定向符號">"未來自sed的輸出直接送往文件newfile中。不要未來自命令的輸出重定向到輸入文件,不然會改寫輸入文件,甚至可能在sed處理這個文件以前,並破壞你的數據。

檢查newfile和testfile文件的差異:

diff testfile  newfile


sed腳本的四種類型

1.對同一文件的多重編輯:sed腳本的第一種類型示範了在一個文件中進行一系列編程工做。咱們使用的第一個示例是將由字處理程序建立的文件轉換爲用於troff的編碼文件。

下面是Horsefeathers Software 產品說明顯然須要作的一個編輯工做的列表:

a.用段落宏(.LP)取代全部的空行。要求是匹配空行,可是,在查看輸入文件內容時,空行是否有前導空格並不明顯。當清楚空格後,它們沒有前導空格,因此空行能夠採用模式「^$」來匹配。(若是行上有空格,那麼模式寫成「^[]*$*」)。所以,能夠用如下的方法簡單的實現:

[root@localhost sed]# cat horse.txt
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
+ _______________
BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business BASIC Librarian, and LIDO.  These software products can fill your

requirements for powerful ,sophisticated,        general-purpose business software providing you with a base for software customization or development.
Horsefeathers BASIC is BASIC optimized for use on the BigOne machine with UNIX or MS-DOS operating systems. BASIC Librarian is a full screen program editor, which also provides the ability

[root@localhost sed]# sed 's/^$/.LP/' horse.txt
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
+ _______________
BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business BASIC Librarian, and LIDO.  These software products can fill your
.LP
requirements for powerful ,sophisticated,        general-purpose business software providing you with a base for software customization or development.
Horsefeathers BASIC is BASIC optimized for use on the BigOne machine with UNIX or MS-DOS operating systems. BASIC Librarian is a full screen program editor, which also provides the ability

's/^$/.LP/' 注意:用'.LP'來取代每一個空行。在替換命令的替換部分沒必要轉義字母句點。


b.咱們的第二個編輯操做是刪除以"+"開始而且包含行式打印機下劃線的行。此處能夠用刪除命令d只刪除這一行。在編寫匹配這一行的模式中,咱們能夠有許多中不一樣的選擇,以下的多種形式均可以匹配這一行。

/^+/

/^+[空格]/

/^+[空格][空格]*/

/^+[空格][空格]*—*/

能夠看出,每一個正則表達式一次匹配的字符愈來愈多。只有經過測試才能決定須要多複雜的表達式來匹配特定的行而不是其餘的行。在正則表達式中定義的模式越長,就越容易使他不會產生不想要的匹配。so,咱們選擇了第三種表達式:

[root@localhost sed]# sed '/^+  */d' horse.txt
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business BASIC Librarian, and LIDO.  These software products can fill your

requirements for powerful ,sophisticated,        general-purpose business software providing you with a base for software customization or development.
Horsefeathers BASIC is BASIC optimized for use on the BigOne machine with UNIX or MS-DOS operating systems. BASIC Librarian is a full screen program editor, which also provides the ability

/^+[空格][空格]*/

注意:這個命令刪除以加號開始而且後面跟有至少一個空格的任意行。模式中指定兩個空格。可是第二個可能每一個 由「*」號修飾,意味着第二個空格能夠有也能夠沒有。

c.刪除在行開始位置填充的空格。匹配序列的模式以下:

s/^[空格][空格]*//

注意:這個命令刪除在行的開頭髮現的任意空格序列。替換命令的替換部分爲空,這意味着刪除了被匹配的字符串。

eg:

[root@localhost sed]# sed 's/^  *//' horse.txt
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
+ _______________

BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business BASIC Librarian, and LIDO.  These software products can fill your

requirements for powerful ,sophisticated,general-purpose business software providing you with a base for software customization or development.Horsefeathers BASIC is BASIC optimized for use
on the BigOne machine with UNIX or MS-DOS operating systems. BASIC Librarian is a full screen program editor, which also provides the ability

d.處理爲了對齊而添加的額外空格。咱們能夠編寫一個替換命令匹配任意連續空格字符串並用一個空格取代他。

s/ [空格][空格] */[空格]/g

注意:在命令的結尾添加全局標誌以便取代全部的出現(不僅是第一個),注意,和前面的正則表達式同樣,咱們不能指定有多少空格,可能有一個或者多個,無論有多少,都將他們縮減爲一個空格。

友情提示:這個命令還匹配單個空格。可是由於替換的命令也是一個空格,所以有一種狀況是實際上「沒有工做」。

命令測試:

[root@localhost sed]# sed -e 's/  */ /g'  horse.txt
HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
+ _______________

 BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business BASIC Librarian, and LIDO. These software products can fill your

requirements for powerful ,sophisticated,general-purpose business software providing you with a base for software customization or development.Horsefeathers BASIC is BASIC optimized for use
 on the BigOne machine with UNIX or MS-DOS operating systems. BASIC Librarian is a full screen program editor, which also provides the ability

上述的表達式有弊端。由於該表達式刪除了跟在句點後的兩個空格序列,而在這裏本應該有兩個空格。

so,爲了完善替換命令以便他不會替換掉句點後面的空格,問題時句點後面也可能跟有3個空格,則須要將他們刪除爲2個空格。所以,表達式以下:

s/\.[空格][空格]*/.[空格][空格]/g  此命令能夠簡化爲: s/\.[空格]/[空格][空格]/g

注意:這個命令用後面跟有兩個空格的句點,替換了後面跟有任意空格的句點。


總結:

s/^$/.LP/

/^+[空格][空格]*/d

s/^[空格]*//

s/[空格][空格]*/[空格]/g

s/\.[空格][空格]*/.[空格][空格]/g


提取宏定義

       troff宏在宏包中進行定義,它一般是存放在某個目錄(例如:/usr/lib/macros)下的一個文件中。troff宏定義老是以字符串'.de'開始,後面跟有可選的空格或者是由一個或者兩個字母構成的宏的名字。宏定義在兩個句點(..)開始的行處結束。本節的內容是從一個宏包中提取特殊的宏定義(它能夠節省你用編輯器定位而且打開文件和搜索想要檢查的行的時間)。

    設計此腳本的第一步是:編寫提取指定宏的部分。

eg:[root@localhost sed]# sed -n '/^\.deBL/','/^\.\.$/p' /usr/lib/macros/mmt

解釋:能夠用-n選項來調用sed從而阻止他打印整個文件,使用這個選項,sed只打印經過打印命令顯示指定要打印的行。sed腳本包含兩個地址:第一個匹配宏定義的開始'.deBL',第二個匹配它的終端,"..",(它自成一行).注意:這兩個模式中出現的句點用反斜槓轉義。而且這兩個地址指定了打印命令p的行範圍,這就是搜索腳本與grep(不能匹配行的範圍)功能的區別。


在shell腳本中可使用位置符號來指定命令行上的每一個參數:第一個參數是$1,第二個參數是$2.以此類推。

sed -n "/^\.de$1/,/^\.\.$/p" /usr/lib/macros/mmt注意:括住sed腳本的雙引號是必須的。若是使用單引號,則shell不對「$1」進行解釋。

例子:此腳本能夠處理任意個宏包,下面的getmac版本容許用戶將宏包的名字指定爲第二個命令行參數。

[root@localhost sed]# cat getmac
#!/bin/bash

#getmac - read macro definition for $1 from package $2

file=/usr/lib/macros/mmt
mac="$1"
case $2 in
-ms) file="/work/macros/current/tmac.s";;
-mm) file="/usr/lib/macros/mmt";;
-man) file="/usr/lib/macros/an";;
esac
sed -n "/^\.de  *$mac/,/^\.\.$/p" $file

解釋:這裏的新內容是case語句,它用於測試$2的值並隨後給變量file賦一個值。注意:首先給file賦了一個默認的值。因此若是用戶沒有指定宏包,那麼就會搜索-mm宏包。並且,爲了清楚,易懂,$1的值被賦值給了mac。

/^\.de  *$mac/:「.de」和宏的名字之間指定了一個空格,後面跟有一個星號,這意味着這個空格是可選的。


生成提綱

文檔例子:

[root@localhost sed]# cat outline.txt
A. Shell Programming
B. Stored Commands
B. Passing Arguments to Shell Scripts
B. Conditional Execution
B. Discarding Used Arguments
B. Repetitive Execution
B. Setting Default Values
B. What We've Accomplished

此腳本須要匹配如下面的宏開始的行

** 章標題(.Se)

** 節標題(.Ah)

** 子節標題(.Bh)

若是咱們須要在那些行上進行替換,用文本標記(例如:A、B)取代宏並添加適當數量的空格(使用製表符)來縮進每一個標題。(記住:"."表示一個製表符)。

s/ "//g         s/[{}]//g

指定全局標誌g來捕獲一行上的全部出現是必要的。然而,關鍵是將這個腳本放在腳本的什麼位置。若是咱們將他放在腳本的結尾,那麼它將在輸出行以後刪除引號。咱們必須將他放在腳本的起始位置並針對多有的行進行修改,無論他們以後是否在腳本中輸出。


編輯工做轉移

sed做爲真正的流程編輯器,在管道中進行編輯操做,這些編輯操做永遠不會被寫回到文件中。

下面的命令時將兩個連續的破折號轉爲一個長破折號。

s/--/\\(em/g

咱們在替換字符中用兩個反斜槓來表示\(em。由於反斜槓在sed中有特殊的含義。


/---/!s/--/\(em/g        /---/!s/--/\(em/g  file | troff

解釋:若是找到含有3個連續的連字符的行,不該用此編輯操做。在全部的其餘行上,應用替換命令。後一個表達式的意思是:改變了輸入文件而且將輸出直接傳遞到troff,而不用建立一箇中間文件。

當一個文檔排版時,將連字符換成長破折號不是惟一要作的美化工做。在troff中,能夠經過鍵入兩個連續的重音符或者「反引號('')」來表示左引號。鍵入兩個連續的單引號('')來標識右引號。咱們可使用sed將每一個雙引號字符換成一個單個的左引號或者單個的有引號。也就是說,當排版時,產生合適的「雙引號」。













。。。。。。。。。。。。。。。。

相關文章
相關標籤/搜索