SED使用手冊


sedstreameditor的縮寫。是一個非交互式上下文(context)編輯器,它被設計在下列三種情況下發揮作用

1) 編輯那些對舒適的交互式編輯而言太大的文件

2) 在編輯命令太複雜而難於在交互模式下鍵入的時候編輯任何大小的文件

3) 要在對輸入的一趟掃描中有效的進行多個全局global)編輯函數

因爲每次只把輸入的某些行駐留在內存中,並且不使用臨時文件,所以可編輯的文件的有效大小,只受限於輸入和輸出要同時共存於次級存儲的要求

可以單獨的建立複雜的編輯腳本並作爲給 sed 的命令文件。對於複雜的編輯,這節省了可觀的鍵入和隨之而來的錯誤。從命令文件運行 sed 高效於作者所知道的任何交互式編輯器,甚至包括能用預先寫好的腳本驅動的編輯器

相較於交互式編輯器而言,根本性的損失是缺乏相對地址(由於操作是每次一行的),和缺乏對命令如期運行的立即驗證

sed UN 編輯器 ed 的直系後代。由於在交互式和非交互式操作之間的差異,在 ed sed 之間已經有了可觀的變化;甚至 ed 的慣常用戶都會經常感到驚訝(並可能氣憤),如果他們沒有閱讀本文檔的章節 2 3,就草率的使用 sed 的話。在兩個編輯器之間最顯著的家族性共同之處,在於他們所識別的模式(正則表達式)的種類;匹配模式的代碼可以從 ed 的代碼幾乎原封不動的複製過來,在章節 2 中對正則表達式的描述就是從 UN Programmer’s Manual[1] 幾乎原封不動的複製過來的。(代碼和描述都是 Dennis M. Ritchie 寫的)

1. Sed

sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲模式空間pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操作;編寫轉換程序等。以下介紹的是Gnu版本的Sed 3.02

2.

可以通過定址來定位你所希望編輯的行,該地址用數字構成,用逗號分隔的兩個行數表示以這兩行爲起止的行的範圍(包括行數表示的那兩行)。如13表示123行,美元符號($)表示最後一行。範圍可以通過數據,正則表達式或者二者結合的方式確定 

3. Sed

調用sed命令有兩種形式:

sed [options] 'command'file(s)

sed [options] -fscriptfile file(s)

a\在當前行後面加入一行文本

b lable分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾

c\用新的文本改變本行的文本

d從模板塊(Pattern space)位置刪除行

D刪除模板塊的第一行

i\在當前行上面插入文本

h拷貝模板塊的內容到內存中的緩衝區

H追加模板塊的內容到內存中的緩衝

g獲得內存緩衝區的內容,並替代當前模板塊中的文本

G獲得內存緩衝區的內容,並追加到當前模板塊文本的後面

l列表不能打印字符的清單

n讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令

N追加下一個輸入行到模板塊後面並在二者間嵌入一個新行,改變當前行號碼

p打印模板塊的行

P(大寫)打印模板塊的第一行

q退出Sed

r filefile中讀行

t labelif分支,從最後一行開始,條件一旦滿足或者Tt命令,將導致分支到帶有標號的命令處,或者到腳本的末尾

T label錯誤分支,從最後一行開始,一旦發生錯誤或者Tt命令,將導致分支到帶有標號的命令處,或者到腳本的末尾

w file寫並追加模板塊到file末尾

W file寫並追加模板塊的第一行到file末尾

!表示後面的命令對所有沒有被選定的行發生作用

s/re/stringstring替換正則表達式re

=打印當前行號碼

#把註釋擴展到下一個換行符以前

以下的是替換標記g表示行內全面替換

p表示打印行

w表示把行寫入一個文件

x表示互換模板塊中的文本和緩衝區中的文本

y表示把一個字符翻譯爲另外的字符(但是不用於正則表達式

4.

-ecommand,--expression=command允許多臺編輯

-h,--help打印幫助,並顯示bug列表的地址

-n,--quiet,--silent取消默認輸出

-f,--filer=script-file引導sed腳本文件

-V,--version打印版本和版權信息

5. 元字符

^錨定行的開始如:/^sed/匹配所有以sed開頭的行

$錨定行的結束如:/sed$/匹配所有以sed結尾的行

.匹配一個非換行符的字符如:/s.d/匹配s後接一個任意字符,然後是d

*匹配零或多個字符如:/*sed/匹配所有模板是一個或多個空格後緊跟sed的行

[]匹配一個指定範圍內的字符,如/[Ss]ed/匹配sedSed

[^]匹配一個不在指定範圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-RT-Z的一個字母開頭,緊跟ed的行

\(..\)保存匹配的字符,如s/\(love\)able/\1rsloveable被替換成lovers

&;保存搜索字符用來替換其他字符,如s/love/**&**/love這成**love**

\<;錨定單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行

\>;錨定單詞的結束,如/love\>/匹配包含以love結尾的單詞的行

x\{m\}重複字符xm次,如:/0\{5\}/匹配包含5o的行

x\{m,\}重複字符x,至少m次,如:/o\{5,\}/匹配至少有5o的行

x\{m,n\}重複字符x,至少m次,不多於n次,如:/o\{5,10\}/匹配5--10o的行

6.

刪除:d命令$ sed '2d' example-----刪除example文件的第二行

$ sed '2,$d'example-----刪除example文件的第二行到末尾所有行

$ sed '$d' example-----刪除example文件的最後一行

$ sed '/test/'dexample-----刪除example文件所有包含test的行

替換:s命令$ sed 's/test/mytest/g' example-----在整行範圍內把test替換爲mytest。如果沒有g標記,則只有每行第一個匹配的test被替換成mytest

$ sed -n's/^test/mytest/p' example-----(-n)選項和p標誌一起使用表示只打印那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就打印它

$ sed 's/^192.168.0.1/&localhost/'example-----&;符號表示替換換字符串中被找到的部份。所有以192.168.0.1開頭的行都會被替換成它自已加localhost,變成192.168.0.1localhost

$ sed -n's/\(love\)able/\1rs/p' example-----love被標記爲1,所有loveable會被替換成lovers,而且替換的行會被打印出來

$ sed 's#10#100#g'example-----不論什麼字符,緊跟着s命令的都被認爲是新的分隔符,所以,“#”在這裏是分隔符,代替了默認的“/”分隔符。表示把所有10替換成100

選定行的範圍:逗號$ sed -n '/test/,/check/p' example-----所有在模板testcheck所確定的範圍內的行都被打印

$ sed -n '5,/^test/p'example-----打印從第五行開始到第一個包含以test開始的行之間的所有行

$ sed'/test/,/check/s/$/sed test/' example-----對於模板testwest之間的行,每行的末尾用字符串sed test替換

多點編輯:e命令$ sed -e '1,5d' -e 's/test/check/'example-----(-e)選項允許在同一行裏執行多條命令。如例子所示,第一條命令刪除15行,第二條命令用check替換test。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果

$ sed--expression='s/test/check/' --expression='/love/d' example-----一個比-e更好的命令是--expression。它能給sed表達式賦值

從文件讀入:r命令$ sed '/test/r file' example-----file裏的內容被讀進來,顯示在與test匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面

寫入文件:w命令$ sed -n '/test/w file' example-----example中所有包含test的行都被寫入file

追加命令:a命令$ sed '/^test/a\\--->this is a example'example<-----'this is a example'被追加到以test開頭的行後面,sed要求命令a後面有一個反斜槓

插入:i命令$ sed '/test/i\\

new line

-------------------------'example

如果test被匹配,則把反斜槓後面的文本插入到匹配行的前面

下一個:n命令$ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變爲bb,並打印該行,然後繼續

變形:y命令$ sed '1,10y/abcde/ABCDE/' example-----1--10行內所有abcde轉變爲大寫,注意,正則表達式元字符不能使用這個命令

退出:q命令$ sed '10q' example-----打印完第10行後,退出sed

保持和獲取:h命令和G命令$ sed -e '/test/h' -e '$G' example-----sed處理文件的時候,每一行都被保存在一個叫模式空間的臨時緩衝區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將打印在屏幕上。接着模式空間被清空,並存入新的一行等待處理。在這個例子裏,匹配test的行被找到後,將存入模式空間,h命令將其複製並存入一個稱爲保持緩存區的特殊緩衝區內。第二條語句的意思是,當到達最後一行後,G命令取出保持緩衝區的行,然後把它放回模式空間中,且追加到現在已經存在於模式空間中的行的末尾。在這個例子中就是追加到最後一行。簡單來說,任何包含test的行都被複制並追加到該文件的末尾

保持和互換:h命令和x命令$ sed -e '/test/h' -e '/check/x' example -----互換模式空間和保持緩衝區的內容。也就是把包含testcheck的行互換

7.

Sed腳本是一個sed的命令清單,啓動Sed時以-f選項引導腳本文件名。Sed對於腳本中輸入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多個命令,要用分號分隔。以#開頭的行爲註釋行,且不能跨行

8. 小技

sed的命令行中引用shell變量時要使用雙引號,而不是通常所用的單引號。下面是一個根據name變量的內容來刪除named.conf文件中zone段的腳本

name='zone\"localhost"'sed "/$name/,/};/d" named.conf

編輯本段單行腳

SED 單行腳本快速參考

SED 單行腳本快速參考 20051229

英文標題:USEFUL ONE-LINE SCRIPTS FOR SED (Unix streameditor)

原標題:HANDY ONE-LINERS FOR SED (Unix stream editor)

整理:Eric Pement - 電郵:pemente[at]northpark[dot]edu 版本5.5

譯者:Joe Hong - 電郵:hq00e[at]126[dot]com

文本間

--------

# 在每一行後面增加一空

sed G

# 將原來的所有空行刪除並在每一行後面增加一空行

# 這樣在輸出的文本中每一行後面將有且只有一空行

sed '/^$/d;G'

# 在每一行後面增加兩行空

sed 'G;G'

# 將第一個腳本所產生的所有空行刪除(即刪除所有偶數行

sed 'n;d'

# 在匹配式樣“regex”的行之前插入一空

sed '/regex/{x;p;x;}'

# 在匹配式樣“regex”的行之後插入一空

sed '/regex/G'

# 在匹配式樣“regex”的行之前和之後各插入一空

sed '/regex/{x;p;x;G;}'

--------

# 爲文件中的每一行進行編號(簡單的左對齊方式)。這裏使用了製表符

# tab,見本文末尾關於'\t'的用法的描述)而不是空格來對齊邊緣

sed = filename | sed'N;s/\n/\t/'

# 對文件中的所有行編號(行號在左,文字右端對齊)

sed = filename | sed 'N;s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'

# 對文件中的所有行編號,但只顯示非空白行的行號

sed '/./=' filename |sed '/./N; s/\n/ /'

# 計算行數(模擬 "wc -l"

sed -n '$='

文本轉換和替

--------

# Unix環境:轉換DOS的新行符(CR/LF)爲Unix格式

sed 's/.$//' # 假設所有行以CR/LF

sed 's/^M$//' # bash/tcsh中,將按Ctrl-M改爲按Ctrl-V

sed 's/\x0D$//' # ssedgsed3.02.80,及更高版

# Unix環境:轉換Unix的新行符(LF)爲DOS格式

sed "s/$/`echo -e\\\r`/" # ksh下所使用的命

sed 's/$'"/`echo\\\r`/" # bash下所使用的命

sed "s/$/`echo\\\r`/" # zsh下所使用的命

sed 's/$/\r/' # gsed3.02.80 及更高版

# DOS環境:轉換Unix新行符(LF)爲DOS格式

sed "s/$//" # 方法 1

sed -n p # 方法 2

# DOS環境:轉換DOS新行符(CR/LF)爲Unix格式

# 下面的腳本只對UnxUtilssed 4.0.7 及更高版本有效。要識別UnxUtils版本

# sed可以通過其特有的“--text”選項。你可以使用幫助選項(“--help”

# 其中有無一個“--text”項以此來判斷所使用的是否是UnxUtils版本。其它DOS

# 版本的的sed則無法進行這一轉換。但可以用“tr”來實現這一轉換

sed "s/\r//"infile >outfile # UnxUtils sed v4.0.7 或更高版

tr -d \r <infile>outfile # GNU tr 1.22 或更高版

# 將每一行前導的空白字符(空格,製表符)刪

# 使之左對齊

sed 's/^[ \t]*//' # 見本文末尾關於'\t'用法的描

# 將每一行拖尾的空白字符(空格,製表符)刪

sed 's/[ \t]*$//' # 見本文末尾關於'\t'用法的描

# 將每一行中的前導和拖尾的空白字符刪

sed 's/^[ \t]*//;s/[\t]*$//'

# 在每一行開頭處插入5個空格(使全文向右移動5字符的位置

sed 's/^/ /'

# 79字符爲寬度,將所有文本右對齊

sed -e :a -e's/^.\{1,78\}$/ &/;ta' # 78字符外加最後的一個空

# 79個字符爲寬度,使所有文本居中。在方法1中,爲了讓文本居中每一行的

# 頭和後頭都填充了空格。在方法2中,在居中文本的過程中只在文本的前面填

# 空格,並且最終這些空格將有一半會被刪除。此外每一行的後頭並未填充空格

sed -e :a -e's/^.\{1,77\}$/ & /;ta' # 方法1

sed -e :a -e's/^.\{1,77\}$/ &/;ta' -e 's/\(*\)\1/\1/' # 方法2

# 在每一行中查找字串“foo”,並將找到的“foo”替換爲“bar”

sed 's/foo/bar/' # 只替換每一行中的第一個“foo”

sed 's/foo/bar/4' # 只替換每一行中的第四個“foo”

sed 's/foo/bar/g' # 將每一行中的所有“foo”都換成“bar”

sed's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替換倒數第二個“foo”

sed 's/\(.*\)foo/\1bar/'# 替換最後一個“foo”

# 只在行中出現字串“baz”的情況下將“foo”替換成“bar”

sed '/baz/s/foo/bar/g'

# “foo”替換成“bar”,並且只在行中未出現字串“baz”的情況下替

sed '/baz/!s/foo/bar/g'

# 不管是“scarlet”“ruby”還是“puce”,一律換成“red”

sed's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' #對多數的sed都有

gsed's/scarlet\|ruby\|puce/red/g' # 只對GNU sed

# 倒置所有行,第一行成爲最後一行,依次類推(模擬“tac”

# 由於某些原因,使用下面命令時HHsed v1.5會將文件中的空行刪

sed '1!G;h;$!d' # 方法1

sed -n '1!G;h;$p' # 方法2

# 將行中的字符逆序排列,第一個字成爲最後一字,……(模擬“rev”

sed'/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

# 將每兩行連接成一行(類似“paste”

sed '$!N;s/\n/ /'

# 如果當前行以反斜槓“\”結束,則將下一行併到當前行末

# 並去掉原來行尾的反斜槓

sed -e :a -e '/\\$/N;s/\\\n//; ta'

# 如果當前行以等號開頭,將當前行併到上一行末

# 並以單個空格代替原來行頭的“=”

sed -e :a -e '$!N;s/\n=//;ta' -e 'P;D'

# 爲數字字串增加逗號分隔符號,將“1234567”改爲“1,234,567”

gsed':a;s/\B[0-9]\{3\}\>/,&/;ta' # GNU sed

sed -e :a -e's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' # 其他sed

# 爲帶有小數點和負號的數值增加逗號分隔符GNUsed

gsed -r':a;s/(^|[^0-9.])([0-9]+)([0-9])/\1\2,\3/g;ta'

# 在每5行後增加一空白行(在第5101520,等行後增加一空白行

gsed '0~5G' # 只對GNUsed

sed 'n;n;n;n;G;' # 其他sed

選擇性地顯示特定

--------

# 顯示文件中的前10(模擬“head”的行爲

sed 10q

# 顯示文件中的第一行(模擬“head -1”命令

sed q

# 顯示文件中的最後10(模擬“tail”

sed -e :a -e'$q;N;11,$D;ba'

# 顯示文件中的最後2行(模擬“tail -2”命令

sed '$!N;$!D'

# 顯示文件中的最後一行(模擬“tail -1”

sed '$!d' # 方法1

sed -n '$p' # 方法2

# 顯示文件中的倒數第二

sed -e '$!{h;d;}' -e x #當文件中只有一行時,輸入空

sed -e '1{$q;}' -e'$!{h;d;}' -e x # 當文件中只有一行時,顯示該

sed -e '1{$d;}' -e'$!{h;d;}' -e x # 當文件中只有一行時,不輸

# 只顯示匹配正則表達式的行(模擬“grep”

sed -n '/regexp/p' # 方法1

sed '/regexp/!d' # 方法2

# 只顯示匹配正則表達式的行(模擬“grep -v”

sed -n '/regexp/!p' # 方法1,與前面的命令相對

sed '/regexp/d' # 方法2,類似的語

# 查找“regexp”並將匹配行的上一行顯示出來,但並不顯示匹配

sed -n'/regexp/{g;1!p;};h'

# 查找“regexp”並將匹配行的下一行顯示出來,但並不顯示匹配

sed -n '/regexp/{n;p;}'

# 顯示包含“regexp”的行及其前後行,並在第一行之前加上“regexp”

# 在行的行號(類似“grep -A1 -B1”

sed -n -e'/regexp/{=;x;1!p;g;$!N;p;D;}' -e h

# 顯示包含“AAA”“BBB”“CCC”的行(任意次序

sed '/AAA/!d; /BBB/!d;/CCC/!d' # 字串的次序不影響結

# 顯示包含“AAA”“BBB”“CCC”的行(固定次序

sed '/AAA.*BBB.*CCC/!d'

# 顯示包含“AAA”“BBB”“CCC”的行(模擬“egrep”

sed -e '/AAA/b' -e'/BBB/b' -e '/CCC/b' -e d # 多數sed

gsed '/AAA\|BBB\|CCC/!d'# GNU sed

# 顯示包含“AAA”的段落(段落間以空行分隔

# HHsed v1.5 必須在“x後加入“G,接下來的3腳本都是這

sed -e '/./{H;$!d;}' -e'x;/AAA/!d;'

# 顯示包含“AAA”“BBB”“CCC”三個字串的段落(任意次序

sed -e '/./{H;$!d;}' -e'x;/AAA/!d;/BBB/!d;/CCC/!d'

# 顯示包含“AAA”“BBB”“CCC”三者中任一字串的段落(任意次序

sed -e '/./{H;$!d;}' -e'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d

gsed'/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d' # 只對GNU sed

# 顯示包含65個或以上字符的

sed -n '/^.\{65\}/p'

# 顯示包含65個以下字符

sed -n '/^.\{65\}/!p' # 方法1,與上面的腳本相對

sed '/^.\{65\}/d' # 方法2,更簡便一點的方

# 顯示部分文本——從包含正則表達式的行開始到最後一行結

sed -n '/regexp/,$p'

# 顯示部分文本——指定行號範圍(從第8至第12行,含812

sed -n '8,12p' # 方法1

sed '8,12!d' # 方法2

# 顯示第52

sed -n '52p' # 方法1

sed '52!d' # 方法2

sed '52q;d' # 方法3,處理大文件時更有效

# 從第3行開始,每7行顯示一

gsed -n '3~7p' # 只對GNUsed

sed -n'3,${p;n;n;n;n;n;n;}' # 其他sed

# 顯示兩個正則表達式之間的文本(包含

sed -n'/Iowa/,/Montana/p' # 區分大小寫方

選擇性地刪除特定

--------

# 顯示通篇文檔,除了兩個正則表達式之間的內

sed '/Iowa/,/Montana/d'

刪除文件中相鄰的重複行(模擬uniq

# 只保留重複行中的第一行,其他行刪

sed '$!N;/^\(.*\)\n\1$/!P; D'

刪除文件中的重複行,不管有無相鄰。注意hold space所能支持的緩存

# 大小,或者使用GNU sed

sed -n 'G;s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'

# 刪除除重複行外的所有行(模擬uniq -d”

sed '$!N;s/^\(.*\)\n\1$/\1/; t; D'

刪除文件中開頭的10

sed '1,10d'

刪除文件中的最後一

sed '$d'

刪除文件中的最後兩

sed 'N;$!P;$!D;$d'

刪除文件中的最後10

sed -e :a -e'$d;N;2,10ba' -e 'P;D' # 方法1

sed -n -e :a -e'1,10!{P;N;D;};N;ba' # 方法2

# 刪除8的倍數

gsed '0~8d' # 只對GNUsed

sed 'n;n;n;n;n;n;n;d;' #其他sed

# 刪除匹配式樣的

sed '/pattern/d' # 刪除含pattern的行。當然pattern

# 可以換成任何有效的正則表達式

刪除文件中的所有空行(與“grep '.' ”效果相同

sed '/^$/d' # 方法1

sed '/./!d' # 方法2

# 只保留多個相鄰空行的第一行。並且刪除文件頂部和尾部的空行

# (模擬“cat -s”

sed '/./,/^$/!d' #方法1刪除文件頂部的空行,允許尾部保留一空

sed '/^$/N;/\n$/D' #方法2,允許頂部保留一空行,尾部不留空

# 只保留多個相鄰空行的前兩行

sed '/^$/N;/\n$/N;//D'

刪除文件頂部的所有空

sed '/./,$!d'

刪除文件尾部的所有空

sed -e :a -e'/^\n*$/{$d;N;ba' -e '}' # 對所有sed

sed -e :a -e'/^\n*$/N;/\n$/ba' # 同上,但只對 gsed 3.02.*

# 刪除每個段落的最後一

sed -n'/^$/{p;h;};/./{x;/./p;}'

特殊應

--------

# 移除手冊頁(man page)中的nroff標記。在Unix System Vbash shell使

# 'echo'命令時可能需要加上 -e 選項

sed "s/.`echo\\\b`//g" # 外層的雙括號是必須的(Unix環境

sed 's/.^H//g' # bashtcsh中,按 Ctrl-V 再按 Ctrl-H

sed 's/.\x08//g' # sed1.5GNU sedssed所使用的十六進制的表示方

# 提取新聞組或 e-mail 的郵件

sed '/^$/q' # 刪除第一行空行後的所有內

# 提取新聞組或 e-mail 的正文部

sed '1,/^$/d' # 刪除第一行空行之前的所有內

# 從郵件頭提取“Subject”(標題欄字段),並移除開頭的“Subject

sed '/^Subject: */!d;s///;q'

# 從郵件頭獲得回覆地

sed '/^Reply-To:/q;/^From:/h; /./d;g;q'

# 獲取郵件地址。在上一個腳本所產生的那一行郵件頭的基礎上進一步的將非電

# 地址的部分剃除。(見上一腳本

sed 's/ *(.*)//;s/>.*//; s/.*[:<] *//'

# 在每一行開頭加上一個尖括號和空格(引用信息

sed 's/^/> /'

# 將每一行開頭處的尖括號和空格刪除(解除引用

sed 's/^> //'

# 移除大部分的HTML標籤(包括跨行標籤

sed -e :a -e's/<[^>]*>//g;/</N;//ba'

# 將分成多卷的uuencode文件解碼。移除文件頭信息,只保留uuencode編碼部分

# 文件必須以特定順序傳給sed。下面第一種版本的腳本可以直接在命令行下輸入

# 第二種版本則可以放入一個帶執行權限的shell腳本中。(由Rahul Dhesi

# 腳本修改而來。

sed '/^end/,/^begin/d'file1 file2 ... fileX | uudecode # vers. 1

sed '/^end/,/^begin/d'"$@" | uudecode # vers. 2

# 將文件中的段落以字母順序排序。段落間以(一行或多行)空行分隔。GNU sed使

# 字元“\v”來表示垂直製表符,這裏用它來作爲換行符的佔位符——當然你也可

# 用其他未在文件中使用的字符來代替它

sed'/./{H;d;};x;s/\n/==/g' file | sort | sed '1s/==//;s/==/\n/g'

gsed '/./{H;d};x;y/\n/\v/'file | sort | sed '1s/\v//;y/\v/\n/'

# 分別壓縮每個.TXT文件,壓縮後刪除原來的文件並將壓縮後的.ZIP

# 命名爲與原來相同的名字(只是擴展名不同)。(DOS環境:“dir /b”

# 顯示不帶路徑的文件名)

echo @echo off>zipup.bat

dir /b *.txt | sed"s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat

典型應

SED的典型用法:Sed接受一個或多個編輯命令,並且每讀入一行後就依次應用這些命令

當讀入第一行輸入後,sed對其應用所有的命令,然後將結果輸出。接着再讀入第

行輸入,對其應用所有的命令……並重復這個過程。上一個例子中sed由標準輸入

備(即命令解釋器,通常是以管道輸入的形式)獲得輸入。在命令行給出一個或

個文件名作爲參數時,這些文件取代標準輸入設備成爲sed的輸入。sed的輸出將

送到標準輸出(顯示器)。因此

cat filename | sed '10q'# 使用管道輸

sed '10q' filename # 同樣效果,但不使用管道輸

sed '10q' filename >newfile # 將輸出轉移(重定向)到磁盤

要了解sed命令的使用說明,包括如何通過腳本文件(而非從命令行)來使用這些

令,請參閱《sed & awk》第二版,作者Dale DoughertyArnold Robbins

O'Reilly1997;),《UN Text Processing》,作

Dale DoughertyTimO'ReillyHayden Books1987)或者是Mike Arst寫的

——壓縮包的名稱是“U-SEDIT2.ZIP”(在許多站點上都找得到)。要發掘sed

的潛力,則必須對正則表達式有足夠的理解。正則表達式的資料可以

Mastering Regular Expressions》作者Jeffrey FriedlO'reilly 1997

Unix系統所提供的手冊頁(“man”)也會有所幫助(試一下這些命

“man sed”“manregexp”,或者看“man ed”中關於正則表達式的部分),

手冊提供的信息比較抽象”——這也是它一直爲人所詬病的。不過,它本來就

是用來教初學者如何使用sed正則表達式的教材,而只是爲那些熟悉這些工具的

提供的一些文本參考

引號語

引號的使用:前面的例子對sed命令基本上都使用單引號('...')而非雙引

"...")這是因爲sed通常是在Unix平臺上使用。單引號下,Unixshell(命

解釋器)不會對美元符($)和後引號(`...`)進行解釋和執行。而在雙引號

美元符會被展開爲變量或參數的值,後引號中的命令被執行並以輸出的結果代

後引號中的內容。而在“csh”及其衍生的shell中使用感嘆號(!)時需要在其

面加上轉義用的反斜槓(就像這樣:\!)以保證上面所使用的例子能正常運

(包括使用單引號的情況下)。DOS版本的Sed則一律使用雙引號("...")而不

引號來圈起命令

'\t' 的使

'\t'的用法:爲了使本文保持行文簡潔,我們在腳本中使用'\t'來表示一個制

符。但是現在大部分版本的sed還不能識別'\t'的簡寫方式,因此當在命令行中

腳本輸入製表符時,你應該直接按TAB鍵來輸入製表符而不是輸入'\t'。下列的

軟件都支持'\t'做爲一個正則表達式的字元來表示製表符awkperlHHsed

sedmod以及GNUsed v3.02.80

SED 的版

不同版本的SED:不同的版本間的sed會有些不同之處,可以想象它們之間在語法

會有差異。具體而言,它們中大部分不支持在編輯命令中間使用標籤(:name)或

支命令(b,t),除非是放在那些的末尾。這篇文檔中我們儘量選用了可移植性較

的語法,以使大多數版本的sed的用戶都能使用這些腳本。不過GNU版本的sed允許使

用更簡潔的語法。想像一下當讀者看到一個很長的命令時的心情

sed -e '/AAA/b' -e '/BBB/b'-e '/CCC/b' -e d

好消息是GNU sed能讓命令更緊湊

sed'/AAA/b;/BBB/b;/CCC/b;d' # 甚至可以寫

sed '/AAA\|BBB\|CCC/b;d'

此外,請注意雖然許多版本的sed接受象“/one/ s/RE1/RE2/”這種在's'前帶有

格的命令,但這些版本中有些卻不接受這樣的命令:“/one/! s/RE1/RE2/”。這

只需要把中間的空格去掉就行了

執行速度的優

SED執行速度的優化:當由於某種原因(比如輸入文件較大、處理器或硬盤較慢等)需要提

命令執行速度時,可以考慮在替換命令(“s/.../.../”)前面加上地址表達式

提高速度。舉例來說

sed 's/foo/bar/g'filename # 標準替換命

sed '/foo/ s/foo/bar/g'filename # 速度更

sed '/foo/ s//bar/g'filename # 簡寫形

當只需要顯示文件的前面的部分或需要刪除後面的內容時,可以在腳本中使用“q”

命令(退出命令)。在處理大的文件時,這會節省大量時間。因此

sed -n '45,50p' filename# 顯示第4550

sed -n '51q;45,50p'filename # 一樣,但快得

如果你有其他的單行腳本想與大家分享或者你發現了本文檔中錯誤的地方,請發

子郵件給本文檔的作者(Eric Pement)。郵件中請記得提供你所使用的sed版本

sed所運行的操作系統及對問題的適當描述。本文所指的單行腳本指命令行的

度在65字符65個以下的sed腳本譯註1。本文檔的各種腳本是由以下所列

者所寫或提供

Al Aab # 建立了“seders”郵件列表

Edgar Allen # 許多方

Yiorgos Adamopoulos # 許多方

Dale Dougherty # sed& awk》作

Carlos Duarte # doit with sed》作

Eric Pement # 本文檔的作

Ken Pizzini # GNU sedv3.02 的作

S.G. Ravenhall # html標籤腳本

Greg Ubben # 有諸多貢獻並提供了許多幫

-------------------------------------------------------------------------

譯註1:大部分情況下,sed腳本無論多長都能寫成單行的形式(通過`-e'選項和`;'

號)——只要命令解釋器支持,所以這裏說的單行腳本除了能寫成一行還對長度

所限制。因爲這些單行腳本的意義不在於它們是以單行的形式出現。而是讓用戶

方便地在命令行中使用這些緊湊的腳本纔是其意義所在。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章